似乎序列化非常简单。假设键和值都是可序列化的,那么什么比在XML中表示键值对更简单?!
致所有评论者:首先,我感谢您的回答,但是 - 我对workoraunds不太感兴趣(网上确实有很多SerializableDictionary实现用于挑选)以及更多关于的原因设计决定。
答案 0 :(得分:4)
这家伙创建了xml serializable dictionary。
答案 1 :(得分:4)
“为什么”部分:
不幸的是,由于基础结构在运行时显式检查IDictionary并禁用序列化,因此无法使用IDictionary派生的对象生成XmlSerializer函数。解决此问题的一种方法是编写一个包装IDictionary对象的新类,并将值复制到可序列化对象的数组中。 XmlSerializer框架还有一个用于编写自定义序列化代码的隐藏钩子。要利用此挂钩,您可以为要序列化/反序列化的对象实现一个名为IXmlSerializable的接口。
当您实例化XmlSerializer对象时,构造函数通常会生成一个包含XmlReader和XmlWriter代码的临时程序集,以便在对象实例和XML文档之间移动。但是,在执行此操作之前,它首先检查提供的类型是否派生自IXmlSerializable,如果是,则生成代码以调用IXmlSerializable成员。换句话说,如果您实现IXmlSerializable,则完全绕过自动序列化过程并有机会提供自己的序列化过程。
您可以在此处阅读整篇文章:XML Files: Advanced Type Mappings
答案 2 :(得分:1)
假设您的问题是(也是)如何以xml格式序列化字典,部分答案是:使用DataContractSerializer:
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;//you need to set a reference to System.Runtime.Serialization.dll!
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dictionary = new Dictionary<int, string>();
dictionary.Add(1,"John");
dictionary.Add(2,"Jane");
var serializer = new DataContractSerializer(typeof(Dictionary<int, string>));
using (var stream = new FileStream("dictionary.xml", FileMode.Create, FileAccess.Write))
{
serializer.WriteObject(stream,dictionary);
}
var xml = File.ReadAllText("dictionary.xml");
Console.WriteLine("dictionary was stored as: {0}",xml);
Console.ReadLine();
}
}
}
答案 3 :(得分:0)
原因很简单:XmlSerializer不支持私有成员,深度序列化或没有默认构造函数的类型字段。简而言之,在大多数情况下它几乎没用。
这是一个可以作为备用选项的解决方案:http://sourceforge.net/projects/nxmlserializer/
答案 4 :(得分:0)
从WCF使用DataContract序列化。 Here is a link.
它与ISerializable的不同之处在于它是一个选择加入,其中ISerializable是选择退出。
的链接