我想要展平一个用于定义protobuf-net合约的类型层次结构,我们目前有类似的东西:
[ProtoContract]
public class SubClass : BaseClass
{
[ProtoMember(1)]
public string Prop1 { get; set; }
}
[ProtoContract]
[ProtoInclude(1, typeof(SubClass))]
public class BaseClass
{
[ProtoMember(100)]
public string Prop2 { get; set; }
}
然后将其重构为
[ProtoContract]
public class SubClass
{
[ProtoMember(1)]
public string Prop1 { get; set; }
[ProtoMember(100)]
public string Prop2 { get; set; }
}
这样在重构之前序列化的实例被成功反序列化。这可以通过选择正确的索引来实现,还是需要做更多的事情呢?
答案 0 :(得分:1)
在幕后,protobuf-net中的继承以一种基本上是多级操作的方式实现。对它进行建模并非易事,坦率地说,使用自动映射器等方法可能更容易,即将数据加载到旧模型中;将其映射到 new 模型;序列化新模型。请注意,这是一个重大变化,之后数据将不兼容。但是,您可以在一个模型中执行此操作如果您可以忍受一点点丑陋(尽管请注意我必须提供不同的字段编号才能使其正常工作):
[ProtoContract]
public class NewClass
{
[ProtoMember(2)]
public string Prop1 { get; set;
[ProtoMember(100)]
public string Prop2 { get; set; }
[ProtoMember(1)] // this 1 is from ProtoMember
private Shim ShimForSerialization { get { return new Shim(this); } }
// this disables the shim during serialiation; only Prop1 and Prop2 will
// be written
public bool ShouldSerializeShimForSerialization() { return false; }
[ProtoContract]
private class Shim {
private readonly NewClass parent;
public Shim(NewClass parent) {
this.parent = parent;
}
[ProtoMember(1)]
public string Prop1 {
get { return parent.Prop1;}
set { parent.Prop1 = value;}
}
}
}