XmlSerializer不能序列化Dictionary对象。。。

     异常:System.NotSupportedException : Cannot serialize member corp.Azure.DictProperties of type System.Collections.Hashtable, because it implements IDictionary.

    原来是因为Dictionary类型只实现的ISerializable接口,而没有实现IXmlSerializable接口,所以在.net 3.0以前用XmlSerializer是不能序列化的。在.net 3.0及以后版本可以使用DataContractSerializer进行序列化。

    一老外的详细解释:
   This question has come up a few times on internal discussion threads recently so I wanted to summarize some highlights. It's correct that you get this error because Dictionary isn't IXmlSerializable. The reason it's this way is layering concerns: Dictionary is in mscorlib.dll but IXmlSerializable is in System.Xml.dll, and we couldn't take a dependency in that direction.
   Before .NET 3.0 you'd have to grow your own solution, such as subclassing Dictionary to implement IXmlSerializable. Moving forward, the recommended solution is to use System.Runtime.Serialization.DataContractSerializer. Note that this is part of the Windows Communication Foundation (WCF), in .NET 3.0. For more details on what is serializable using the data contract serializer, see: http://msdn2.microsoft.com/en-us/library/ms731923.aspx

   --the end
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`XmlSerializer`是.NET中用于XML序列化和反序列化的类,但它无法直接序列化`Dictionary`字典对象。这是因为`Dictionary`类在.NET中不是可序列化的类型。 `XmlSerializer`可以序列化和反序列化具有公共可读/可写属性的类和结构,以及数组和集合类型。但是,在序列化过程中,它无法处理键/值对的字典结构。 要序列化字典对象,你可以使用其他方法,例如将字典转换为可序列化的类型,或使用其他序列化库(如`DataContractSerializer`或`Json.NET`)。 如果你仍然希望使用`XmlSerializer`来序列化字典,你可以考虑创建一个可序列化的封装类来存储字典的键和值,并在需要时将其转换为字典。以下是一个示例代码: ```csharp using System; using System.Collections.Generic; using System.Xml.Serialization; public class SerializableDictionary<TKey, TValue> { [XmlArrayItem("Item")] public List<SerializableKeyValuePair<TKey, TValue>> Items { get; set; } public SerializableDictionary() { Items = new List<SerializableKeyValuePair<TKey, TValue>>(); } public SerializableDictionary(Dictionary<TKey, TValue> dictionary) { Items = new List<SerializableKeyValuePair<TKey, TValue>>(); foreach (var kvp in dictionary) { Items.Add(new SerializableKeyValuePair<TKey, TValue>(kvp.Key, kvp.Value)); } } public Dictionary<TKey, TValue> ToDictionary() { var dictionary = new Dictionary<TKey, TValue>(); foreach (var item in Items) { dictionary[item.Key] = item.Value; } return dictionary; } } public class SerializableKeyValuePair<TKey, TValue> { [XmlAttribute("Key")] public TKey Key { get; set; } [XmlAttribute("Value")] public TValue Value { get; set; } public SerializableKeyValuePair() { } public SerializableKeyValuePair(TKey key, TValue value) { Key = key; Value = value; } } public class Program { public static void Main() { // 创建一个字典 Dictionary<string, int> dictionary = new Dictionary<string, int>(); dictionary.Add("Apple", 1); dictionary.Add("Banana", 2); dictionary.Add("Orange", 3); // 将字典转换为可序列化的类型 var serializableDictionary = new SerializableDictionary<string, int>(dictionary); // 创建XmlSerializer对象序列化字典 XmlSerializer serializer = new XmlSerializer(typeof(SerializableDictionary<string, int>)); using (var writer = new System.IO.StringWriter()) { serializer.Serialize(writer, serializableDictionary); string xml = writer.ToString(); Console.WriteLine(xml); } } } ``` 上述代码中,我们创建了一个`SerializableDictionary`类,它包含一个`Items`属性,用于存储字典的键值对。然后,我们将字典转换为`SerializableDictionary`对象,并使用`XmlSerializer`将其序列化为XML字符串。 希望这个示例可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值