2

我有一个与序列化 HashSet类似的问题

我有一个类型为成员的类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 的对象被反序列化(并调用构造函数)时,列表被正确恢复,正如我在调试器中看到的那样。

但是在序列化器完成后,该对象只包含一个空的哈希集。

4

1 回答 1

1

假设您的 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;
} 

这段代码运行良好。

于 2012-10-12T07:22:51.417 回答