protobuf- net пропускает член (типа интерфейса) из базового класса - PullRequest
1 голос
/ 14 июля 2020

У меня есть класс Base, который определяет член типа IMember с именем Member. Затем у меня есть класс Child, который наследует Base и определяет новый член IMember с именем Member2. Я сериализую экземпляр класса Child, сохраненный в переменной типа Base, ожидая, что все дочерние и базовые члены будут сериализованы. За исключением того, что в то время как Member2 из Child сериализуется, член с тем же типом, который определен в классе Base, НЕ сериализуется (или, по крайней мере, при десериализации я получаю ноль для его значения)

Мои классы точно такие:

    [ProtoContract]
    [ProtoInclude(100, typeof(Member))]
    public interface IMember {
        [ProtoMember(1, IsRequired = true)]
        int value { get; set; }
    }

    [ProtoContract()]
    public class Member : IMember {
        [ProtoMember(1, IsRequired = true)]
        public int value { get; set; }
    }

    [ProtoContract()]
    public class Base  {

        [ProtoMember(1, IsRequired = true)] 
        public virtual string Name { get; set; } = "Base";
        
        [ProtoMember(2, IsRequired = true)]
        public IMember MyMember { get; set; } = null;

    }

    [ProtoContract()]
    public class Child : Base {
        
        [ProtoMember(1, IsRequired = true)]
        public override string Name { get; set; } = "Child";

        [ProtoMember(2, IsRequired = true)]
        public IMember MyMember2 { get; set; } = null;
        
    }

Тестовый код выглядит следующим образом:

    static void Main(string[] args) {
        
        Base b = new Child() {
            MyMember =  new Member() { value = 10 },
            MyMember2 = new Member() { value = 20 }
        };

        var stream = new MemoryStream();
        Serializer.Serialize(stream, b);
        var bytes = stream.ToArray();
        
        stream = new MemoryStream(bytes);
        var obj = Serializer.Deserialize<Child>(stream);

        Console.ReadLine();
    }

Десериализованный объект obj имеет Member == null, а Member2 != null. Почему?

1 Ответ

0 голосов
/ 14 июля 2020

В базовом классе отсутствует атрибут [ProtoInclude] для указания иерархии.

[ProtoContract()]
[ProtoInclude(100, typeof(Child))]
public class Base  {

    [ProtoMember(1, IsRequired = true)] 
    public virtual string Name { get; set; } = "Base";
    
    [ProtoMember(2, IsRequired = true)]
    public IMember MyMember { get; set; } = null;

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