为什么.NET中没有XML可序列化的字典?

ser*_*ist 73 .net dictionary xml-serialization appsettings

我需要一个XML可序列化的字典.实际上,我现在有两个完全不同的程序需要一个.我很惊讶地看到.NET没有.我在其他地方问了这个问题并得到了讽刺的回应.我不明白为什么这是一个愚蠢的问题.

考虑到各种.NET特性对XML序列化的依赖性,有人可以启发我,为什么没有XML可序列化的字典.希望你也可以解释为什么有些人认为这是一个愚蠢的问题.我想我必须遗漏一些基本的东西,我希望你能填补空白.

Lou*_*ier 52

我知道之前已经回答了这个问题,但是因为我有一个非常简洁的方法(代码)用于使用DataContractSerializer类进行IDictionary序列化(由WCF使用,但可以并且应该在任何地方使用)我无法抗拒在这里贡献它:

public static class SerializationExtensions
{
    public static string Serialize<T>(this T obj)
    {
        var serializer = new DataContractSerializer(obj.GetType());
        using (var writer = new StringWriter())
        using (var stm = new XmlTextWriter(writer))
        {
            serializer.WriteObject(stm, obj);
            return writer.ToString();
        }
    }
    public static T Deserialize<T>(this string serialized)
    {
        var serializer = new DataContractSerializer(typeof(T));
        using (var reader = new StringReader(serialized))
        using (var stm = new XmlTextReader(reader))
        {
            return (T)serializer.ReadObject(stm);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这在.NET 4中完美运行,也应该在.NET 3.5中运行,尽管我还没有测试它.

更新:不适用于.NET Compact Framework(甚至不适用于Windows Phone 7的NETCF 3.7),因为DataContractSerializer不支持!

我把流式传输到字符串是因为它对我来说更方便,虽然我可以将一个较低级别的序列化引入Stream然后用它来序列化为字符串,但我倾向于仅在需要时进行推广(就像过早优化是邪恶的一样) ,所以它是过早的概括...)

用法很简单:

// dictionary to serialize to string
Dictionary<string, object> myDict = new Dictionary<string, object>();
// add items to the dictionary...
myDict.Add(...);
// serialization is straight-forward
string serialized = myDict.Serialize();
...
// deserialization is just as simple
Dictionary<string, object> myDictCopy = 
    serialized.Deserialize<Dictionary<string,object>>();
Run Code Online (Sandbox Code Playgroud)

myDictCopy将是myDict的逐字副本.

您还会注意到,所提供的泛型方法将能够序列化任何类型(据我所知),因为它不仅限于IDictionary接口,它实际上可以是任何泛型类型T.

希望它可以帮助那里的人!

  • 效果很好!对于其他开发人员:如果您还没有,那么您需要为`System.Runtime.Serialization`添加项目引用,但它在.NET 4.0 Client Profile中可用. (5认同)

Joh*_*ers 14

关于XML Serialization的事情是,它不仅仅是创建一个字节流.它还涉及创建这个字节流将验证的XML Schema.XML Schema中没有很好的方法来表示字典.你能做的最好的事情就是表明有一把独特的钥匙.

您始终可以创建自己的包装器,例如One Way to Serialize Dictionaries.


Joe*_*ung 13

他们在.NET 3.0中添加了一个.如果可以,请添加对System.Runtime.Serialization的引用,并查找System.Xml.XmlDictionary,System.Xml.XmlDictionaryReader和System.Xml.XmlDictionaryWriter.

我同意它不在特别容易发现的地方.

  • 这些类不是通用的可序列化字典.它们与WCF中的序列化实现有关. (4认同)