gpt4 book ai didi

c# - DataContractSerializer 不序列化继承 ISerializable 的类的成员

转载 作者:太空狗 更新时间:2023-10-29 23:19:29 24 4
gpt4 key购买 nike

我有这门课:

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,因此需要实现 protected 构造函数和 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);
}

测试失败,因为 Name 属性为空! (虽然整数被正确地(反)序列化了)发生了什么事?

编辑:它与私有(private)的名称支持字段无关。将其公开具有相同的结果。

最佳答案

这与ISerializable无关; DataContractSerializer 根本不使用 ISerializable(它将使用IXmlSerializable,但您不想这样做...)

大多数序列化程序,包括 XmlSerializerDataContractSerializer(以及数据绑定(bind),就此而言),将集合视为不同于实体。它可以是一个另一个,但不能同时是两者。因为它检测到它是一个“集合”,所以它序列化内容(即集合中的任何内容),而不是属性(名称 等)。

您应该封装一个集合,而不是继承它。

还有;要正确使用 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;}
}

关于c# - DataContractSerializer 不序列化继承 ISerializable 的类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1285018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com