Web services 使用为web方法实现IDictionary的内置对象的替代方法

Web services 使用为web方法实现IDictionary的内置对象的替代方法,web-services,asmx,Web Services,Asmx,我有一个使用ASP.NET中创建的web服务的web应用程序。在这个web服务中,我希望传递键值类型的集合对象(如Hashtable或Dictionary)。 但是我们不能使用从IDictionary实现的对象。 我不想在web服务中创建序列化类。 有人能给我推荐最好的方法吗?您可以尝试使用两个数组,一个用于键,一个用于值,数组的索引匹配。不是最理想的解决方案,而是有效的解决方案。您可以使用IDictionary来传递该对象的键和值。dev.e.loper几乎是正确的。您可以使用列表 或者,您

我有一个使用ASP.NET中创建的web服务的web应用程序。在这个web服务中,我希望传递键值类型的集合对象(如Hashtable或Dictionary)。

但是我们不能使用从IDictionary实现的对象。

我不想在web服务中创建序列化类。


有人能给我推荐最好的方法吗?

您可以尝试使用两个数组,一个用于键,一个用于值,数组的索引匹配。不是最理想的解决方案,而是有效的解决方案。您可以使用IDictionary来传递该对象的键和值。

dev.e.loper几乎是正确的。您可以使用
列表

或者,您可以使用
列表

MSDN文档:


    • 我不太清楚你的问题,但也许你需要这样的东西

      using System.Collections.Generic;
      using System.Xml;
      using System.Xml.Schema;
      using System.Xml.Serialization;
      
      [XmlRoot("dictionary")]
      public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
      {
          public XmlSchema GetSchema()
          {
              return null;
          }
      
          public void ReadXml(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 != XmlNodeType.EndElement)
              {
                  reader.ReadStartElement("item");
      
                  reader.ReadStartElement("key");
                  var key = (TKey)keySerializer.Deserialize(reader);
                  reader.ReadEndElement();
      
                  reader.ReadStartElement("value");
                  var value = (TValue)valueSerializer.Deserialize(reader);
                  reader.ReadEndElement();
      
                  this.Add(key, value);
                  reader.ReadEndElement();
                  reader.MoveToContent();
              }
      
              reader.ReadEndElement();
          }
      
          public void WriteXml(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();
              }
          }
      }
      
      使用System.Collections.Generic;
      使用System.Xml;
      使用System.Xml.Schema;
      使用System.Xml.Serialization;
      [XmlRoot(“字典”)]
      公共类SerializableDictionary:Dictionary,IXmlSerializable
      {
      公共XmlSchema GetSchema()
      {
      返回null;
      }
      公共void ReadXml(XmlReader)
      {
      var keySerializer=新的XmlSerializer(typeof(TKey));
      var-valueSerializer=新的XmlSerializer(typeof(TValue));
      bool waspempy=reader.isemptyelment;
      reader.Read();
      如果(为空)
      {
      返回;
      }
      while(reader.NodeType!=XmlNodeType.EndElement)
      {
      reader.ReadStartElement(“项目”);
      reader.ReadStartElement(“密钥”);
      var key=(TKey)keySerializer.反序列化(reader);
      reader.ReadEndElement();
      reader.ReadStartElement(“价值”);
      var value=(TValue)valueSerializer.Deserialize(reader);
      reader.ReadEndElement();
      添加(键、值);
      reader.ReadEndElement();
      reader.MoveToContent();
      }
      reader.ReadEndElement();
      }
      public void WriteXml(XmlWriter)
      {
      var keySerializer=新的XmlSerializer(typeof(TKey));
      var-valueSerializer=新的XmlSerializer(typeof(TValue));
      foreach(此.Keys中的var键)
      {
      编写人。书面启动项(“项目”);
      writer.writeStart元素(“键”);
      序列化(编写器,键);
      writer.writeedelement();
      writer.writeStarteElement(“值”);
      t值=此[键];
      序列化(写入程序,值);
      writer.writeedelement();
      writer.writeedelement();
      }
      }
      }
      
      您可以从可序列化的KeyedCollection继承


      我使用DictionaryEntry解决了这个问题

      唯一的区别是键也是对象

      我基本上有一个
      Dictionary-to-Dictionary(DictionaryEntry[]entries)
      和一个
      DictionaryEntry[]fromdctionary(Dictionary-entries)
      静态方法,这些方法非常轻量级,最终可以让我到达相同的位置,而不必创建自己的集合类

      额外的好处是,由此产生的XML更接近WCF Web服务默认使用的XML!这意味着您现在可以在您的客户机代码中进行此更改,并且如果您决定以这种方式移动,就可以为WCF做好准备


      JSON
      [{“Key”:key1,“Value”:value1},{“Key”:key2,“Value”:value2}]上的结果与默认情况下在WCF上的结果完全相同。

      为什么不能使用字典,为什么故意避免编写序列化类?不能使用从IDictionary继承的类型作为web方法返回类型