序列化字典中的哈希集



我有一个与序列化哈希集类似的问题

我有一个类,其成员类型为 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;
} 

这段代码效果很好。

最新更新