Я сейчас пробую 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
.
Итак, что я делаю здесь не так?