我有一个与序列化哈希集类似的问题
我有一个类,其成员类型为 Dictionary<String,HashSet<T>>
当我使用 BinaryFormatter 序列化对象,然后反序列化它时,它显示为空。
我不知道如何或在哪里调用此处发布的解决方法。
有什么提示吗?提前谢谢。
编辑:我试图将哈希集转换为列表,正如另一个线程中的一条评论所建议的那样。
对象如下所示:
public class THashSet : HashSet<T> , ISerializable
{
public THashSet(SerializationInfo info, StreamingContext context)
{
var list = (List<T>)info.GetValue("hashset", typeof(List<T>));
foreach (T t in list)
this.Add(t);
}
public override void GetObjectData(SerializationInfo info,StreamingContext context)
{
info.AddValue("hashset", this.ToList<T>());
}
当包含 THashSet 的对象被反序列化(并调用构造函数)时,列表将正确恢复,如我在调试器中看到的那样。
但是在序列化程序完成后,该对象仅包含一个空哈希集。
假设对于您的 T 对象,您没有覆盖方法 GetHashCode 和 Equals。你需要这样做。
UPD:一切都取决于您的对象实现。对象并不像你说的那么容易。你的坐姿,对象:
[Serializable]
public class DataClass
{
public DataClass()
{
}
public DataClass(string name, string description)
{
Name = name;
Description = description;
this.Dictionary = new Dictionary<string, HashSet<DataClass>>();
}
public string Name { get; set; }
public string Description { get; set; }
public Dictionary<string, HashSet<DataClass>> Dictionary { get; set; }
}
和序列化/反序列化代码:
DataClass dataClass = new DataClass("name", "descr");
dataClass.Dictionary.Add("key1", new HashSet<DataClass>() { new DataClass("sample11", "descr11"), new DataClass("sample12", "descr12") });
dataClass.Dictionary.Add("key2", new HashSet<DataClass>() { new DataClass("sample21", "descr21"), new DataClass("sample22", "descr22") });
dataClass.Dictionary.Add("key3", new HashSet<DataClass>() { new DataClass("sample31", "descr31"), new DataClass("sample32", "descr32") });
byte[] serialized;
var formatter = new BinaryFormatter();
using (MemoryStream stream = new MemoryStream())
{
formatter.Serialize(stream, dataClass);
serialized = stream.ToArray();
}
using (MemoryStream streamDeserial = new MemoryStream())
{
streamDeserial.Write(serialized, 0, serialized.Length);
streamDeserial.Seek(0, SeekOrigin.Begin);
var dictDeserial = formatter.Deserialize(streamDeserial) as DataClass;
}
这段代码效果很好。