答えて
どのシリアル化APIですか?
たとえば、DataContractSerializer
は、特に(オプション)[CollectionDataContract]
マークアップを使用して辞書を処理できます。 protobuf-netがそれらを処理します(下記)。その他はありません...
var data = new Dictionary<string, int>();
data.Add("abc", 123);
data.Add("def", 456);
var clone = Serializer.DeepClone(data);
Console.WriteLine(clone["abc"]);
Console.WriteLine(clone["def"]);
として意志BinaryFormatter
:
using (MemoryStream ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, data);
ms.Position = 0;
clone = (Dictionary<string, int>) bf.Deserialize(ms);
}
+1。私はDataContractSerializerをDictionaryのシリアライザとして提案していました。 photobuf-netに言及していることは言うまでもありません。 :-) – RichardOD
JSON.Netはもちろん、辞書もシリアル化できます。 –
ありません。 HashtableまたはDictionaryは、.NETのボックス外でシリアライズできません。 XMLとバイナリの両方のシリアル化を行うSerializableDictionary hereの実装があります。ここで
は、リンク(著作権(C)Dacris Software社MITライセンス)からのコードです:
直列化APIusing System;
using System.Runtime.Serialization;
using System.Xml;
using System.Xml.Serialization;
using System.Collections.Generic;
using System.Text;
[Serializable()]
public class SerializableDictionary<TKey, TVal> : Dictionary<TKey, TVal>, IXmlSerializable, ISerializable
{
#region Constants
private const string DictionaryNodeName = "Dictionary";
private const string ItemNodeName = "Item";
private const string KeyNodeName = "Key";
private const string ValueNodeName = "Value";
#endregion
#region Constructors
public SerializableDictionary()
{
}
public SerializableDictionary(IDictionary<TKey, TVal> dictionary)
: base(dictionary)
{
}
public SerializableDictionary(IEqualityComparer<TKey> comparer)
: base(comparer)
{
}
public SerializableDictionary(int capacity)
: base(capacity)
{
}
public SerializableDictionary(IDictionary<TKey, TVal> dictionary, IEqualityComparer<TKey> comparer)
: base(dictionary, comparer)
{
}
public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
: base(capacity, comparer)
{
}
#endregion
#region ISerializable Members
protected SerializableDictionary(SerializationInfo info, StreamingContext context)
{
int itemCount = info.GetInt32("ItemCount");
for (int i = 0; i < itemCount; i++)
{
KeyValuePair<TKey, TVal> kvp = (KeyValuePair<TKey, TVal>)info.GetValue(String.Format("Item{0}", i), typeof(KeyValuePair<TKey, TVal>));
this.Add(kvp.Key, kvp.Value);
}
}
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("ItemCount", this.Count);
int itemIdx = 0;
foreach (KeyValuePair<TKey, TVal> kvp in this)
{
info.AddValue(String.Format("Item{0}", itemIdx), kvp, typeof(KeyValuePair<TKey, TVal>));
itemIdx++;
}
}
#endregion
#region IXmlSerializable Members
void IXmlSerializable.WriteXml(System.Xml.XmlWriter writer)
{
//writer.WriteStartElement(DictionaryNodeName);
foreach (KeyValuePair<TKey, TVal> kvp in this)
{
writer.WriteStartElement(ItemNodeName);
writer.WriteStartElement(KeyNodeName);
KeySerializer.Serialize(writer, kvp.Key);
writer.WriteEndElement();
writer.WriteStartElement(ValueNodeName);
ValueSerializer.Serialize(writer, kvp.Value);
writer.WriteEndElement();
writer.WriteEndElement();
}
//writer.WriteEndElement();
}
void IXmlSerializable.ReadXml(System.Xml.XmlReader reader)
{
if (reader.IsEmptyElement)
{
return;
}
// Move past container
if (!reader.Read())
{
throw new XmlException("Error in Deserialization of Dictionary");
}
//reader.ReadStartElement(DictionaryNodeName);
while (reader.NodeType != XmlNodeType.EndElement)
{
reader.ReadStartElement(ItemNodeName);
reader.ReadStartElement(KeyNodeName);
TKey key = (TKey)KeySerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadStartElement(ValueNodeName);
TVal value = (TVal)ValueSerializer.Deserialize(reader);
reader.ReadEndElement();
reader.ReadEndElement();
this.Add(key, value);
reader.MoveToContent();
}
//reader.ReadEndElement();
reader.ReadEndElement(); // Read End Element to close Read of containing node
}
System.Xml.Schema.XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
#endregion
#region Private Properties
protected XmlSerializer ValueSerializer
{
get
{
if (valueSerializer == null)
{
valueSerializer = new XmlSerializer(typeof(TVal));
}
return valueSerializer;
}
}
private XmlSerializer KeySerializer
{
get
{
if (keySerializer == null)
{
keySerializer = new XmlSerializer(typeof(TKey));
}
return keySerializer;
}
}
#endregion
#region Private Members
private XmlSerializer keySerializer = null;
private XmlSerializer valueSerializer = null;
#endregion
}
ここのリンクからコードをコピーするのはとても親切ですか? –
完了すると、クリックするためのリンクが1つ少なくなります。 –
@ScottLerchこれはまだ本当ですか? – Thomas
- 1. カスタム.NET XML辞書(キー、値)シリアライズ
- 2. ServiceStack.Textシリアライズ辞書
- 3. 、シリアライズ辞書2.0
- 4. Jsonは辞書内で辞書をシリアライズ
- 5. クッキーの辞書をシリアライズするには?
- 6. WCF辞書<文字列、オブジェクト>シリアライズ
- 7. Request.Formを辞書などにシリアライズ
- 8. JavaScriptSerializerを使用して辞書をシリアライズ
- 9. .NET:共通プログラミング・キーワード辞書
- 10. .Netの同時辞書でGrowTableメソッド
- 11. C#/。NET:辞書のメモリ使用量
- 12. 特定の形式の辞書<string、string>をシリアライズ
- 13. ServiceStackオブジェクトを使用して辞書のシリアライズとデシリアライズ
- 14. JSONを.NETでシリアライズ
- 15. .NETコアJSONシリアライズ(ExpandoObject)
- 16. Protobuf-net v2と大きな辞書
- 17. .NET CF 3.5 TextBox - 無効化辞書
- 18. RestSharp/ASP.NET WebApiを使用したカスタムJson辞書シリアライズ
- 19. 辞書をJSONにシリアライズする奇妙な結果
- 20. 辞書変数をシリアライズ/デシリアライズする方法は?
- 21. C#辞書内の辞書
- 22. 辞書のpython辞書
- 23. ユーザー辞書のリソース辞書
- 24. 辞書内の辞書javascript
- 25. 辞書の処理辞書
- 26. 辞書辞書python
- 27. LdapConnectionから.NETタイプをシリアライズ
- 28. C#.netでテキストボックスをシリアライズ
- 29. .NETコア、SignalR 2シリアライズ(日時)
- 30. 辞書(コレクション)オブジェクトをファイルに書き込む方法(VB .Net 2010)
?彼らはそれぞれ異なるでしょう... –