C# 在字典中序列化哈希集

C# 在字典中序列化哈希集,c#,.net,serialization,hashset,C#,.net,Serialization,Hashset,我也有类似的问题 我有一个类,其成员类型为Dictionary 当我用BinaryFormatter序列化对象,然后反序列化它时,它会变成空的 我不知道该怎么做,也不知道该在哪里找到解决办法 有什么提示吗?提前谢谢 编辑: 我尝试将哈希集转换为列表,正如另一个线程中的一条注释所建议的那样 该对象如下所示: public class THashSet : HashSet<T> , ISerializable { public THashSet(SerializationInf

我也有类似的问题

我有一个类,其成员类型为
Dictionary

当我用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:HashSet,ISerializable
{
公共THashSet(SerializationInfo信息、StreamingContext上下文)
{
var list=(list)info.GetValue(“hashset”,typeof(list));
foreach(列表中的T)
本条增补(t);
}
公共覆盖无效GetObjectData(SerializationInfo、StreamingContext上下文)
{
info.AddValue(“hashset”,this.ToList());
}
当包含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; }
}
[可序列化]
公共类数据类
{       
公共数据类()
{
}
公共数据类(字符串名称、字符串描述)
{
名称=名称;
描述=描述;
this.Dictionary=新字典();
}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字典{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;
} 
DataClass DataClass=新数据类(“名称”、“描述”);
Add(“key1”,newhashset(){newdataclass(“sample11”,“descr11”),newdataclass(“sample12”,“descr12”)});
Add(“key2”,newhashset(){newdataclass(“sample21”,“descr21”),newdataclass(“sample22”,“descr22”)});
Add(“key3”,newhashset(){newdataclass(“sample31”,“descr31”),newdataclass(“sample32”,“descr32”)});
字节[]序列化;
var formatter=新的二进制格式化程序();
使用(MemoryStream stream=new MemoryStream())
{
序列化(流、数据类);
序列化=stream.ToArray();
}
使用(MemoryStream streamDeserial=new MemoryStream())
{
streamDeserial.Write(序列化,0,序列化.长度);
streamDeserial.Seek(0,SeekOrigin.Begin);
var dictDeserial=格式化程序。反序列化(streamDeserial)为数据类;
} 

此代码运行良好。

使用其他序列化程序,例如。它适合您的情况。遗憾的是,我不能使用其他序列化程序,因为这是一个相当大的项目中的一个小细节。其他所有内容都序列化良好。我实现了这些函数,但没有results@Dr.Wummi你能把你的T形物体或类似物体贴在w上吗使用这些函数实现。有了这些对象,我还可以尝试重现您的问题。该对象仅包含公共字符串成员,以及一些仅将部分字符串设置为默认值的构造函数。该对象在使用的其他方法(ArrayList、List和Dictionary)中序列化良好谢谢你的回答。你的方法按预期工作。我不知道为什么,但当对象有一个成员,如
公共字典{get;set;}
它可以工作,但是如果我有一个自定义类,它只是从hashset派生出来,比如
公共类THashset:hashset
,而对象有一个成员,比如
公共字典{get;set;}
它不工作。但是,谢谢,这解决了问题