我在尝试使用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的所有反序列化的istances都被设置为null,即使它们在调用Serializer.DeepClone()之前被正确地赋值。我发现使其工作的唯一方法是在类Tutor中标记为抽象属性,并在NannyTutorChild中实现它们。
我知道它可能看起来像层次结构一样愚蠢,但在我们的真实项目中,我们有很多不同的类来自我们的'Tutor'类,并且所有级别都需要进行类型转换或使用正确的方法:)
有什么想法吗?我做错了吗?
谢谢大家, 垫。
答案 0 :(得分:2)
目前不支持此方案;我仍然需要解决DynamicType
和继承的组合的复杂性;我会在我的待处理工作队列中将其向前推进,但是:它今天不存在。