最近在公司代码中一个WEB SERVICE 看到使用字典类型做为返回类型,如下:
[WebMethod] public IDictionary<string, string> UpdateThreadById(RequestThread reqThread)....
DEBUG,出现下面的Exception:
Cannot serialize interface System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].
解决方法如下, 增一个类型:
[XmlRoot("dictionary")]public class SerializableDictionary<TKey, TValue>: Dictionary<TKey, TValue>, IXmlSerializable
{ #region IXmlSerializable Members public System.Xml.Schema.XmlSchema GetSchema() {return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{var keySerializer = new XmlSerializer(typeof(TKey));
var valueSerializer = new XmlSerializer(typeof(TValue));
bool wasEmpty = reader.IsEmptyElement;reader.Read();
if (wasEmpty) return; while (reader.NodeType != System.Xml.XmlNodeType.EndElement) { reader.ReadStartElement("item"); reader.ReadStartElement("key");TKey key = (TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value"); TValue value = (TValue)valueSerializer.Deserialize(reader);reader.ReadEndElement();
Add(key, value);reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
public void WriteXml(System.Xml.XmlWriter writer)
{var keySerializer = new XmlSerializer(typeof(TKey));
var valueSerializer = new XmlSerializer(typeof(TValue));
foreach (var key in this.Keys)
{ writer.WriteStartElement("item"); writer.WriteStartElement("key");keySerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteStartElement("value");TValue value = this[key];
valueSerializer.Serialize(writer, value);writer.WriteEndElement();
writer.WriteEndElement();
}
}
#endregion}
好了,用个新的类型替换原来的,就可以了。
希望对您开发有帮助。
作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-Petter Liu Blog。