2011-06-28 99 views
1

我有序列化的基类。protobuf-net将基类反序列化为继承类

[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 

回答

2

(重修订)

基础上的意见,提出的方案是:

  • 有两种类型,其中发生是在C#中的子类
  • 系列化
  • ,我们只是想在它们之间平滑地交换 - 没有继承代码(也就是说,您可以保存为Web2PdfEntity并加载为Web2PdfServer或vv)

这是对正常使用情况中,在那里继承的类型期望序列化期间继承(其改变的数据)有一点不同,并且不相关的类型是可以互换的,只要该合同适合。

有几种方法可以解决这个问题;一个小问题是默认它不看继承的属性,以避免重复。你可能重新做广告,但这有点不好看。就个人而言,我觉得我会受到诱惑,只要告诉它的应用程序,在启动过程中做什么:

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

现在您现有的Serializer代码将正确对待Web2PdfServer,其中包括两个属性所示。

+0

我无法在Web2PdfEntity类中添加[ProtoContract,ProtoInclude(8,typeof(Web2PdfServer))]]属性,因为Web2PdfEntity将在类库(分离的程序集)中编译,因为安全原因将不包含Web2PdfServer类。是否有可能以其他方式解决问题? – Tomas

+0

@Marc,我试图使用你的代码,并尝试反序列化类时发生错误System.InvalidCastException'发生在protobuf-net.dll中var web2Pdf = Serializer.Deserialize (“c:\ Web2PdfEntity-class-to-序列化-file.bin“); – Tomas

+0

@Tomas - 所写的代码应该没问题;你的意思是“我用你的代码减去属性”?不能使用attribs,请参阅更新 –