protobuf-net и поддержка интерфейса

Этот вопрос напрямую в значительной степени перед сопровождающим (-ями) 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?

1
задан wal 19 August 2010 в 15:11
поделиться

1 ответ

Основная проблема, которую я вижу, заключается в том, что с точки зрения полезной нагрузки это перемещает данные в под-сообщение. У меня есть несколько похожих проектов для v2, которые, надеюсь, обойдут это, сохраняя большинство значений в основном сообщении. По соображениям здравомыслия, я в основном имел в виду только v2 для этого изменения (поскольку две реализации будут раздельными, а у v2 гораздо лучше модель типов).

Однако, должно быть возможно поддерживать оба режима использования. Если вы хотите прислать это как патч для v1 (с той же лицензией и т.д.), я с удовольствием посмотрю :)


Это доступно как стандартная функция v2

2
ответ дан 2 September 2019 в 21:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: