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;}
它不工作。但是,谢谢,这解决了问题