Dab*_*rnl 5 .net c# serialization datacontractserializer
我有这门课:
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Grouping
{
[Serializable]
public class Group<T> : HashSet<T>
{
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; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
由于它继承自HashSet,它必须实现ISerializable,因此受保护的构造函数和GetObjectData方法.以前我使用BinaryFormatter成功地序列化和反序列化了这个类.
因为我希望能够检查序列化程序生成的输出,我想切换到DataContractSerializer.
我写了这个测试:
[TestMethod]
public void SerializeTest()
{
var group = new Group<int>("ints"){1,2,3};
var serializer = new DataContractSerializer(typeof (Group<int>));
using (var stream=File.OpenWrite("group1.xml"))
{
serializer.WriteObject(stream,group);
}
using (var stream=File.OpenRead("group1.xml"))
{
group = serializer.ReadObject(stream) as Group<int>;
}
Assert.IsTrue(group.Contains(1));
Assert.AreEqual("ints",group.Name);
}
Run Code Online (Sandbox Code Playgroud)
测试失败,因为Name属性为null!(虽然整数被(de)正确序列化)发生了什么?
编辑:它与名称支持字段是私有的无关.公开它也有同样的结果.
这跟无关ISerializable; DataContractSerializer根本不使用 ISerializable(它会使用IXmlSerializable,但你不想这样做......)
大多数序列化程序(包括XmlSerializer和DataContractSerializer(和数据绑定))将集合视为与实体不同.它可以是一个或另一个,但不是两个.因为它检测到它是一个"集合",它会序列化内容(即集合中的任何内容),而不是属性(Name等).
您应该封装一个集合,而不是继承它.
也; 要正确使用DataContractSerializer,添加[DataMember]/ [DataContract]属性是明智的.例如:
[Serializable, DataContract] // probably don't need [Serializable]
public class Group<T>
{
[DataMember]
public HashSet<T> Items { get; private set; }
protected Group()
{
Items = new HashSet<T>();
}
public Group(string name) : this()
{
Name = name;
}
[DataMember]
public string Name {get ;private set;}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4727 次 |
| 最近记录: |