在.NET中是否有一个序列化的通用键/值对类?

我正在寻找一个可以包含在Web服务中的键/值对对象。

我尝试使用.NET的System.Collections.Generic.KeyValuePair<>类,但它不正确序列化在Web服务。 在Web服务中,Key和Value属性没有被序列化,使得这个类没有用处,除非有人知道解决这个问题的方法。

有没有其他的generics类可以用于这种情况?

我会使用.NET的System.Web.UI.Pair类,但它的types使用对象。 如果仅用于types安全性,那么使用通用类将会很好。

只需定义一个结构/类。

 [Serializable] public struct KeyValuePair<K,V> { public K Key {get;set;} public V Value {get;set;} } 

我不认为这是因为Dictionary<>本身不是XML可序列化的,当我需要通过Web服务发送一个字典对象时,我最终包装了Dictionary<>对象,并添加了对IXMLSerializable支持。

 /// <summary> /// Represents an XML serializable collection of keys and values. /// </summary> /// <typeparam name="TKey">The type of the keys in the dictionary.</typeparam> /// <typeparam name="TValue">The type of the values in the dictionary.</typeparam> [XmlRoot("dictionary")] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable { #region Constants /// <summary> /// The default XML tag name for an item. /// </summary> private const string DEFAULT_ITEM_TAG = "Item"; /// <summary> /// The default XML tag name for a key. /// </summary> private const string DEFAULT_KEY_TAG = "Key"; /// <summary> /// The default XML tag name for a value. /// </summary> private const string DEFAULT_VALUE_TAG = "Value"; #endregion #region Protected Properties /// <summary> /// Gets the XML tag name for an item. /// </summary> protected virtual string ItemTagName { get { return DEFAULT_ITEM_TAG; } } /// <summary> /// Gets the XML tag name for a key. /// </summary> protected virtual string KeyTagName { get { return DEFAULT_KEY_TAG; } } /// <summary> /// Gets the XML tag name for a value. /// </summary> protected virtual string ValueTagName { get { return DEFAULT_VALUE_TAG; } } #endregion #region Public Methods /// <summary> /// Gets the XML schema for the XML serialization. /// </summary> /// <returns>An XML schema for the serialized object.</returns> public XmlSchema GetSchema() { return null; } /// <summary> /// Deserializes the object from XML. /// </summary> /// <param name="reader">The XML representation of the object.</param> public void ReadXml(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 != XmlNodeType.EndElement) { reader.ReadStartElement(ItemTagName); reader.ReadStartElement(KeyTagName); TKey key = (TKey)keySerializer.Deserialize(reader); reader.ReadEndElement(); reader.ReadStartElement(ValueTagName); TValue value = (TValue)valueSerializer.Deserialize(reader); reader.ReadEndElement(); this.Add(key, value); reader.ReadEndElement(); reader.MoveToContent(); } reader.ReadEndElement(); } /// <summary> /// Serializes this instance to XML. /// </summary> /// <param name="writer">The writer to serialize to.</param> public void WriteXml(XmlWriter writer) { XmlSerializer keySerializer = new XmlSerializer(typeof(TKey)); XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue)); foreach (TKey key in this.Keys) { writer.WriteStartElement(ItemTagName); writer.WriteStartElement(KeyTagName); keySerializer.Serialize(writer, key); writer.WriteEndElement(); writer.WriteStartElement(ValueTagName); TValue value = this[key]; valueSerializer.Serialize(writer, value); writer.WriteEndElement(); writer.WriteEndElement(); } } #endregion } 

你会发现为什么KeyValuePairs不能被序列化在这个MSDN博客文章

结构答案是最简单的解决scheme,但不是唯一的解决scheme。 一个“更好的”解决scheme是编写一个可序列化的Custom KeyValurPair类。

  [Serializable] public class SerializableKeyValuePair<TKey, TValue> { public SerializableKeyValuePair() { } public SerializableKeyValuePair(TKey key, TValue value) { Key = key; Value = value; } public TKey Key { get; set; } public TValue Value { get; set; } } 

在4.0框架中,还增加了可序列化和可等化的Tuple族。 您可以使用Tuple.Create(a, b)new Tuple<T1, T2>(a, b)

KeyedCollection是一种字典types,可以直接序列化为xml而不会有任何废话。 唯一的问题是你必须通过:coll [“key”]来访问值。

XmlSerializer不能用于字典。 哦,它也有KeyValuePairs的问题

http://www.codeproject.com/Tips/314447/XmlSerializer-doesnt-work-with-Dictionaries-Oh-and

你可以使用Tuple<string,object>

有关Tuple用法的更多详细信息,请参阅以下内容: 在C#4.0中使用Tuple