这与this question有关,但这次我试图找出如何序列化字典。我有一个继承自Dictionary的类,我需要能够序列化。
序列化方法看起来像这样,基本上字典中的值集合被添加到列表中,序列化了。
[Serializable]
public class Collection: SortedDictionary<Key, Node>, ISerializable
{
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
List<Node> Nodes = new List<Node>();
// The "Values" mentioned here is the SortedDictionary's Values collection
Nodes.AddRange(Values);
info.AddValue("Nodes", Nodes, Nodes.GetType());
}
public Collection(SerializationInfo info, StreamingContext context)
: base(new Key.Comparer())
{
List<Node> SerValues = (List<Node>)info.GetValue("Nodes", typeof(List<Node>));
foreach (Node ThisNode in SerValues)
{
// This add method has been extended so that it automatically generates the key.
Add(ThisNode);
}
}
}
但是,当我调用deserialize构造函数时,列表包含正确的值,只是空值。
我怀疑这是因为节点尚未反序列化(我知道它们可以序列化),但是我该如何解决这个问题?
答案 0 :(得分:1)
您是否尝试Xml序列化/反序列化字典?这就是您实现ISerializable接口并使用SerializationInfo的原因吗?
虽然Xml序列化程序不支持通用字典类型,但DataContractSerializer会这样做,也许您可以尝试使用它?如果不这样做,这里是一个Xml可序列化字典的实现,可能值得一看:
http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx
答案 1 :(得分:0)
您是否尝试在集合类中使用[Serializable]
属性?结果是一样的吗?
(为什么使用ISerializable而不是属性?)
答案 2 :(得分:0)
如果我没弄错,词典不可序列化。
烨: http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/5115ff4c-75a6-4a96-9c6b-b840e04c650d/
这也意味着只是继承它并调用子Serializable将无法正常工作。您将不得不使用另一个容器 - 通常是自定义类Key / Value容器的数组 - 没有太严重。
答案 3 :(得分:0)
您可能希望使用代理(实现ISerializationSurrogate)而不是上述方法。
请查看http://msdn.microsoft.com/en-us/magazine/cc188950.aspx示例。