protobuf-net将基类反序列化为继承类

时间:2011-06-28 11:08:37

标签: serialization inheritance protobuf-net base-class

我有序列化的基类。

[ProtoContract]
public class Web2PdfEntity 
{   


        [ProtoMember(1)]
        public string Title { get; set; }
        [ProtoMember(2)]
        public string CUrl { get; set; }
}

我想将Web2PdfEntity类反序列化为继承自Web2PdfEntity的Web2PdfServer。

public class Web2PdfServer : Web2PdfEntity
{

public void MyServerMethod {}
public void MyServerMethod2{}
}

我尝试使用下面的代码反序列化类,遗憾的是未设置属性。

var web2Pdf = Serializer.Deserialize<Web2PdfServer>("c:\Web2PdfEntity-class-to-serialize-file.bin");
web2Pdf.Title //<- not deserialized
web2Pdf.CURL //<- not deserialized

1 个答案:

答案 0 :(得分:2)

(经过大量修订)

根据评论,提出的方案是:

  • 有两种类型,发生是C#
  • 中的子类
  • 在序列化中,我们只想在它们之间平滑交换 - 没有继承代码(即你可以保存为Web2PdfEntity并加载为Web2PdfServer或v.v.)

这与普通用例略有不同,其中继承类型期望序列化期间继承(更改数据),并且只要契约适合,不相关类型就可以互换。

有几种方法可以解决这个问题;一个小问题是默认它不会查看继承的属性,以避免重复。你可以重新宣传它们,但这有点笨拙。就个人而言,我认为我很想告诉它在app启动时该做什么:

var metaType = RuntimeTypeModel.Default.Add(typeof(Web2PdfServer), false);
metaType.Add(1, "Title").Add(2, "CUrl");

现在,您现有的Serializer代码会正确处理Web2PdfServer,包括所指示的两个属性。