扁平化一个protobufs-net合同

时间:2013-01-11 12:44:00

标签: c# protobuf-net

我想要展平一个用于定义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; }
}

这样在重构之前序列化的实例被成功反序列化。这可以通过选择正确的索引来实现,还是需要做更多的事情呢?

1 个答案:

答案 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;}
        }

    }
}