为什么字典对象不能在C#中进行XmlSerialized?

时间:2009-10-15 17:34:45

标签: .net serialization dictionary xml-serialization

似乎序列化非常简单。假设键和值都是可序列化的,那么什么比在XML中表示键值对更简单?!

致所有评论者:首先,我感谢您的回答,但是 - 我对workoraunds不太感兴趣(网上确实有很多SerializableDictionary实现用于挑选)以及更多关于的原因设计决定

5 个答案:

答案 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是选择退出。

这是一个谈论collections with DataContract serialization

的链接