ProtoBuf.net序列化派生类时不包括基类属性

使用最新的2.0 beta版ProtoBuf.net我试图序列化派生类(只是示例),我得到空文件。 为什么基类属性没有序列化?

[ProtoContract] [Serializable] public class Web2PdfClient : Web2PdfEntity { } [ProtoContract] [Serializable] public class Web2PdfEntity : EngineEntity { [ProtoMember(1)] public string Title { get; set; } [ProtoMember(2)] public string CUrl { get; set; } [ProtoMember(3)] public string FileName { get; set; } } [ProtoContract] [Serializable] public class EngineEntity { public bool Result { get; set; } public string ErrorMessage { get; set; } public bool IsMembershipActive { get; set; } public int ConversionTimeout { get; set; } public byte[] FileStorage { get; set; } } 

使用下面的代码序列化类我得到空文件。

 var Web2PDF = new Web2PdfClient { CUrl = "http://www.google.com", FileName = "test.txt" }; using (var file = File.Create(@"C:\Users\Administrator\Projects\temp\test.bin")) { Serializer.Serialize(file, Web2PDF); } 

实际上,我很惊讶没有抛出exception – 我会调查! 为了使其工作,基类型必须具有唯一的方式来指示每个子类型。 这可以通过属性指定,或者(在v2中)在运行时指定。 例如:

 [ProtoContract] [Serializable] public class Web2PdfClient : Web2PdfEntity { } [ProtoContract] [ProtoInclude(7, typeof(Web2PdfClient))] [Serializable] public class Web2PdfEntity : EngineEntity { ... } 

除了它不应该与为该类型定义的任何其他成员碰撞之外,没有什么特别的。 可以定义多个子类型(使用不同的标签)。 另请注意,protobuf-net不会查看[Serializable] ,因此除非您还使用BinaryFormatter (或类似的),否则不需要它。

类似地, EngineEntity应该公布预期的子类型,并且应该指示要序列化的成员(以及针对哪个标记)。