DataContractSerializer的序列化不是类的成员,它继承了ISerializable
-
18-09-2019 - |
题
我有此类:
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; }
}
}
}
如从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);
}
由于名称属性为null,则测试失败! (整数是(德)序列正确虽然) 这是怎么回事?
编辑:它无关名为支持字段是私有的。使其公共有相同的结果。
解决方案
这是无关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;}
}
不隶属于 StackOverflow