DataContractSerializer不是序列化inheritanceISerializable的类的成员
我有这堂课:
using System; using System.Collections.Generic; using System.Runtime.Serialization; namespace Grouping { [Serializable] public class Group : HashSet { public Group(string name) { this.name = name; } protected Group(){} protected Group(SerializationInfo info, StreamingContext context):base(info,context) { name = info.GetString("koosnaampje"); } public override void GetObjectData(SerializationInfo info,StreamingContext context) { base.GetObjectData(info,context); info.AddValue("koosnaampje", Name); } private string name; public string Name { get { return name; } private set { name = value; } } } }
由于它inheritance自HashSet,它必须实现ISerializable,因此受保护的构造函数和GetObjectData方法。 以前我使用BinaryFormatter成功地序列化和反序列化了这个类。
因为我希望能够检查序列化程序生成的输出,我想切换到DataContractSerializer。
我写了这个测试:
[TestMethod] public void SerializeTest() { var group = new Group("ints"){1,2,3}; var serializer = new DataContractSerializer(typeof (Group)); using (var stream=File.OpenWrite("group1.xml")) { serializer.WriteObject(stream,group); } using (var stream=File.OpenRead("group1.xml")) { group = serializer.ReadObject(stream) as Group; } Assert.IsTrue(group.Contains(1)); Assert.AreEqual("ints",group.Name); }
测试失败,因为Name属性为null! (整数是(de)正确序列化)发生了什么?
编辑:它与名称支持字段是私有的无关。 公开它也有同样的结果。
这与ISerializable
无关; DataContractSerializer
根本不使用 ISerializable
(它将使用IXmlSerializable
,但你不想这样做……)
大多数序列化程序(包括XmlSerializer
和DataContractSerializer
(以及数据绑定)都将集合视为与实体不同。 它可以是一个或另一个,但不是两个。 因为它检测到它是一个“集合”,它会序列化内容 (即集合中的任何内容 ),而不是属性( Name
等)。
您应该封装一个集合,而不是inheritance它。
也; 要正确使用DataContractSerializer
,最好添加[DataMember]
/ [DataContract]
属性。 例如:
[Serializable, DataContract] // probably don't need [Serializable] public class Group { [DataMember] public HashSet Items { get; private set; } protected Group() { Items = new HashSet (); } public Group(string name) : this() { Name = name; } [DataMember] public string Name {get ;private set;} }