Этот вопрос напрямую в значительной степени перед сопровождающим (-ями) protobuf-net, но кто-то еще, пожалуйста, комментирует.
Я пытался сериализовать класс, который содержит свойство, которое имеет тип интерфейса, то есть:
[DataContract]
public class SampleDataClass
{
[DataMember(Order=1)]
public int Field1 { get; set; }
[DataMember(Order = 2)]
public IPayload Payload { get; set; }
}
[ProtoContract]
[ProtoInclude(1, typeof(Payload))]
public interface IPayload
{
int Field4 { get; set; }
}
[DataContract]
public class Payload : IPayload
{
[DataMember(Order = 1)]
public int Field4 { get; set; }
}
Мне удалось заставить это работать, изменив источник v1 protobuf-net. I did not see any problem with this approach as long as ProtoInclude is defined for the interface.
Clearly to get this to compile I had to allow ProtoContract and ProtoInclude to be decorated on interfaces, plus a few other changes here and there. (note, I would have used DataContract/KnownType however these attributes are also not able to be decorated on interfaces)
Can you please comment on possible shortcomings?
Основная проблема, которую я вижу, заключается в том, что с точки зрения полезной нагрузки это перемещает данные в под-сообщение. У меня есть несколько похожих проектов для v2, которые, надеюсь, обойдут это, сохраняя большинство значений в основном сообщении. По соображениям здравомыслия, я в основном имел в виду только v2 для этого изменения (поскольку две реализации будут раздельными, а у v2 гораздо лучше модель типов).
Однако, должно быть возможно поддерживать оба режима использования. Если вы хотите прислать это как патч для v1 (с той же лицензией и т.д.), я с удовольствием посмотрю :)
Это доступно как стандартная функция v2