Привязка ProtoInclude к соответствующей привязке RuntimeTypeModel не работает - PullRequest
1 голос
/ 10 января 2020

Я сейчас пробую protobuf- net, и у меня возникла проблема с сериализацией следующей структуры класса:

[ProtoContract]
public abstract class WorkerResponseBase
{
    [ProtoMember(1)]
    public WorkerErrorMessage ErrorMessage { get; set; }

    [ProtoMember(2)]
    public bool IsSuccess { get; set; }

    [ProtoMember(3)]
    public bool IsError { get; set; }

    protected WorkerResponseBase()
    {
    }

    protected WorkerResponseBase(bool isSuccess, [CanBeNull] string errorMessage)
    {
        IsSuccess = isSuccess;
        IsError = !isSuccess;
        ErrorMessage = new WorkerErrorMessage(errorMessage);
    }
}

[ProtoContract()]
public class WorkerResponse<TPayload> : WorkerResponseBase
{
    [ProtoMember(4)]
    public TPayload PayloadOrNull { get; private set; }

    ....
}

Когда я впервые попробовал его с конкретным классом, как, например, WorkerResponse<LoginResult>, Я мог только сериализовать PayloadOrNull.

Хорошо, я немного погуглил о том, как заставить это работать. Я нашел этот ответ: ProtoBuf- Net ProtoInclude Generi c Тип подкласса

Люди упомянули, что [ProtoInclude] требуется.

Итак, для тестирования этого Я пытался украсить WorkerResponseBase с [ProtoInclude(100, typeof(WorkerResponse<LoginResult>))]. Корзина go, сериализация работает отлично.

Теперь, как вы могли себе представить, это очень общий c контейнер для ответа, поэтому я не хотел бы определять все возможные TPayload загружается в базовый класс, поэтому чуть ниже в связанном комментарии я обнаружил, что я также должен иметь возможность делать это динамически и, в конечном итоге, с помощью рефлексии.

Поэтому для целей тестирования я вместо этого сделал следующее [ProtoInclude]:

RuntimeTypeModel.Default.Add(typeof(WorkerResponseBase), false)
    .AddSubType(100, typeof(WorkerResponse<LoginResult>));

Однако, когда я запускаю это, сериализация вообще не работает, даже сериализация PayloadOrNull.

Итак, что я делаю здесь не так?

1 Ответ

2 голосов
/ 10 января 2020

false в вашем коде (до Add) в основном говорит "и я собираюсь сам все контролировать, не обрабатывать свойства и их атрибуты - я вам прямо скажу". Поскольку вы не делаете это, вы, вероятно, хотите передать true. В ожидающем API V3 это необязательный параметр со значением по умолчанию true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...