当前位置:  开发笔记 > 编程语言 > 正文

如何在WebService中返回通用字典

如何解决《如何在WebService中返回通用字典》经验,为你挑选了3个好方法。

根据搜索,我希望C#中的Web服务返回一个Dictionary:

Dictionary GetValues(string search) {}

Web服务编译很好,但是,当我尝试引用它时,我收到以下错误:"不支持,因为它实现了IDictionary."

¿我能做些什么来使这个工作?,任何不涉及返回DataTable的想法?



1> Warren Blanc..:

没有"默认"方式来获取Dictionary并将其转换为XML.您必须选择一种方式,并且您的Web服务的客户在使用您的服务时必须注意相同的方式.如果客户端和服务器都是.NET,那么您可以简单地使用相同的代码在两端将字典序列化和反序列化为XML.

在这篇博文中有代码可以做到这一点.此代码使用Dictionary的键和值的默认序列化,当您具有非字符串类型时,这非常有用.代码使用继承来做它的事情(你必须使用该子类来存储你的值).您也可以使用本文最后一项中的包装类型方法,但请注意该文章中的代码只使用ToString,因此您应该将它与第一篇文章结合使用.

因为我同意Joel关于StackOverflow是所有内容的规范来源,所以下面是第一个链接的代码副本.如果您发现任何错误,请编辑此答案!

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

[XmlRoot("dictionary")]
public class SerializableDictionary : Dictionary, IXmlSerializable
{
    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer 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();

            this.Add(key, value);

            reader.ReadEndElement();

            reader.MoveToContent();
        }

        reader.ReadEndElement();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
        XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));

        foreach (TKey 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
}



2> John Saunder..:

创建一个类型MyKeyValuePair,并返回一个List>,从字典中复制.


也可以使用标准的KeyValuePair.

3> Moose..:

本文有一个序列化IDictionaries的方法.寻找"我注意到默认情况下XmlSerializer不会序列化实现IDictionary的对象.有什么方法可以解决这个问题吗?" 在页面下方约2/3.

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有