您的位置:首页 > 其它

.net2.0中WebService在序列化xml数据Generic字典类型的问题

2011-01-13 15:55 489 查看
最近在公司代码中一个WEBSERVICE看到使用字典类型做为返回类型,如下:

[WebMethod]
publicIDictionary<string,string>UpdateThreadById(RequestThreadreqThread)....


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

DEBUG,出现下面的Exception:

CannotserializeinterfaceSystem.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")]
publicclassSerializableDictionary<TKey,TValue>:Dictionary<TKey,TValue>,IXmlSerializable
{
#regionIXmlSerializableMembers
publicSystem.Xml.Schema.XmlSchemaGetSchema()
{
returnnull;
}
publicvoidReadXml(System.Xml.XmlReaderreader)
{
varkeySerializer=newXmlSerializer(typeof(TKey));
varvalueSerializer=newXmlSerializer(typeof(TValue));
boolwasEmpty=reader.IsEmptyElement;
reader.Read();
if(wasEmpty)
return;
while(reader.NodeType!=System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
TKeykey=(TKey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement("value");
TValuevalue=(TValue)valueSerializer.Deserialize(reader);
reader.ReadEndElement();
Add(key,value);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
publicvoidWriteXml(System.Xml.XmlWriterwriter)
{
varkeySerializer=newXmlSerializer(typeof(TKey));
varvalueSerializer=newXmlSerializer(typeof(TValue));
foreach(varkeyinthis.Keys)
{
writer.WriteStartElement("item");
writer.WriteStartElement("key");
keySerializer.Serialize(writer,key);
writer.WriteEndElement();
writer.WriteStartElement("value");
TValuevalue=this[key];
valueSerializer.Serialize(writer,value);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
#endregion
}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

好了,用个新的类型替换原来的,就可以了。

希望对您开发有帮助。

作者:PetterLiu
出处:http://www.cnblogs.com/wintersun/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
该文章也同时发布在我的独立博客中-PetterLiuBlog。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐