У меня есть класс 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
. Почему?