ASP.NET で作成された Web サービスを使用する Web アプリケーションがあります。この Web サービスでは、キー値型 (Hashtable や Dictionay など) のコレクション オブジェクトを渡したいと考えています。
ただし、IDictionary から実装されたオブジェクトは使用できません。
Web サービスでシリアル化されたクラスを作成したくありません。
誰でもこれに最適なアプローチを提案できますか?
5 に答える
dev.e.loperはほぼ正しいです。を使用できますList<Pair>
。
または、を使用することもできますList<KeyValuePair<TKey,TValue>>
。
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();
}
}
}
DictionaryEntryを使用してこれを解決しました
唯一の違いは、キーもオブジェクトであるということです。
基本的に、Dictionary ToDictionary(DictionaryEntry[] entries)
非常DictionaryEntry[] FromDictionary(Dictionary entries)
に軽量で静的メソッドがあり、独自のコレクションクラスを作成しなくても同じ場所に移動できます。
追加の利点は、結果として得られるXMLが、WCFWebサービスがデフォルトで使用するXMLに近いことです。つまり、クライアントコードでこの変更を行うことができ、そのように移動することにした場合はWCFの準備ができています。
[{"Key": key1, "Value": value1}, {"Key": key2, "Value": value2}]
結果は、デフォルトでWCFを使用した場合とまったく同じように、JSONを使用した場合のようになります。
Serializable である KeyedCollection から継承できます。
配列のインデックスが一致するキー用と値用の 2 つの配列を使用することができます。最も理想的なソリューションではありませんが、有効なソリューションです。IDictionaryを使用して、そのオブジェクトのキーと値を渡すだけのWebサービスの内部。