【问题标题】:Serializing a HashSet in a Dictionary序列化字典中的 HashSet
【发布时间】:2012-10-12 07:18:16
【问题描述】:

我遇到了与Serializing a HashSet类似的问题

我有一个成员类型为 Dictionary<String,HashSet<T>> 的类

当我用 BinaryFormatter 序列化对象,然后反序列化它时,它是空的。

我不知道如何或在哪里调用发布在here 的解决方法。

任何提示?提前致谢。

编辑: 我尝试将哈希集转换为列表,正如另一个线程中的一个 cmets 所建议的那样。

对象看起来像这样:

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 的对象(并调用构造函数)时,列表被正确恢复,正如我在调试器中看到的那样。

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

【问题讨论】:

  • 使用其他一些序列化程序,例如Json.Net。它适用于您的情况。
  • 遗憾的是我不能使用另一个序列化程序,因为这是一个相当大的项目中的一个小细节。其他一切都很好地序列化

标签: c# .net serialization hashset


【解决方案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;
} 

这段代码运行良好。

【讨论】:

  • 我实现了这些功能,但没有结果
  • @Dr.Wummi 您能否发布您的 T 对象或具有这些功能实现的类似对象。有了这些对象,我也可以尝试通过我来重现您的问题。
  • 该对象仅包含公共字符串成员,以及一些仅将部分字符串设置为默认值的构造函数。此对象在它使用的其他方法(ArrayLists、Lists 和字典)中可以很好地序列化
  • 感谢您的回答。您的方法按预期工作。我不知道为什么,但是当对象有一个像public Dictionary&lt;string, HashSet&lt;DataClass&gt;&gt; Dictionary { get; set; } 这样的成员时,它可以工作,但是如果我有一个自定义类,它只是从像public class THashset : HashSet&lt;T&gt; 这样的哈希集派生而来,并且对象有一个像public Dictionary&lt;string, THashset&gt; Dictionary { get; set; } 这样的成员,它不会' t.. 但是谢谢,这解决了问题
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多