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
应该公布其预期的子类型,并且应该指示要序列化的成员(以及针对哪个标记)。