поддержка protobuf-net и интерфейса - PullRequest
1 голос
/ 19 августа 2010

Этот вопрос напрямую во многом связан с сопровождающим (ями) 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.Я не видел никаких проблем с этим подходом, пока ProtoInclude определено для интерфейса.

Ясно, что для компиляции я должен был разрешить оформление ProtoContract и ProtoInclude на интерфейсах, плюс несколько других изменений здесьи там.(обратите внимание, я бы использовал DataContract / KnownType, однако эти атрибуты также не могут быть оформлены на интерфейсах)

Не могли бы вы прокомментировать возможные недостатки?

1 Ответ

2 голосов
/ 19 августа 2010

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

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


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

...