如何使用protobuf用抽象类序列化层次结构

本文关键字:序列化 层次结构 抽象类 何使用 protobuf | 更新日期: 2023-09-27 18:20:22

我在尝试使用protobuf序列化类的层次结构时遇到了一些问题。从抽象类继承的类没有实现的属性没有得到正确的值。例如,当我尝试测试以下层次结构时…:

[ProtoContract]
[ProtoInclude(11, typeof(Child))]
[ProtoInclude(12, typeof(Nanny))]
public abstract class Person
{
    [ProtoMember(1)]
    public string Name { get; set; }
}
[ProtoContract]
public class Child : Person
{
    public Child(){ }
}
[ProtoContract]
public class Nanny : Person
{
    public Nanny()
    {
        Tutors = new List<ITutor<Person, Person>>();
    }
    [ProtoMember(1)]
    public List<ITutor<Person, Person>> Tutors { get; set; }
}
[ProtoContract]
[ProtoInclude(11, typeof(NannyTutorChild))]
public interface ITutor<out T, out U>
    where T : Person
    where U : Person
{
    [ProtoMember(1, AsReference = true, DynamicType = true)]
    T TutoredBy { get; }
    [ProtoMember(2, AsReference = true, DynamicType = true)]
    U Tutored { get; }
}
[ProtoContract]
public abstract class Tutor<T, U> : ITutor<T, U>
    where T : Person
    where U : Person
{
    [ProtoMember(1, AsReference = true, DynamicType = true)]
    public T TutoredBy { get; set; }
    [ProtoMember(2, AsReference = true, DynamicType = true)]
    public U Tutored { get; set; }
}
[ProtoContract]
public abstract class NannyTutor<U> : Tutor<Nanny, U>
    where U : Person
{
}
[ProtoContract]
public class NannyTutorChild : NannyTutor<Child>
{
}

NannyTutorChild的所有反序列化的istance都被设置为null,即使它们在调用Serializer.DeepClone()之前被正确地赋值。我发现的唯一方法是将类Tutor中的属性标记为抽象,并在NannyTutor Child中实现它们。

我知道层次结构看起来可能很傻,但在我们的真实项目中,我们有很多不同的类源于我们的"导师"类,所有级别都需要进行类型转换或使用正确的方法:)

知道吗?我做错什么了吗?

谢谢大家,材料

如何使用protobuf用抽象类序列化层次结构

当前不支持此场景;CCD_ 1和继承的组合有一个复杂性,我仍然需要解决;我会把它放在我等待完成的工作队列中,但是:它今天不在那里。