1

我有序列化的基类。

[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
4

1 回答 1

2

(大量修改)

根据评论,呈现的场景是:

  • 有两种类型,恰好是 C# 中的子类
  • 在序列化中,我们只想在它们之间进行简单的交换——没有继承代码(即你可以保存为Web2PdfEntity和加载为Web2PdfServer,或 vv)

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

有几种方法可以解决这个问题;一个小问题是默认情况下它不查看继承的属性,以避免重复。您可以重新宣传它们,但这有点笨拙。就个人而言,我想我很想告诉它在应用程序启动期间要做什么:

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

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

于 2011-06-28T11:19:34.337 回答