在c#中序列化字典 [英] Serialize Dictionary in c#
本文介绍了在c#中序列化字典的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有词典
词典< string,List< string>> Dic = new 字典<字符串,List<字符串>>();
如何使用此序列化class?
序列化等级
[XmlRoot( Dictionary)]
public class SerializableDictionary< TKey,TValue> :Dictionary< TKey,TValue>,IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return 空跨度>;
}
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();
此 .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 = 此 [key];
valueSerializer.Serialize(writer, value );
writer.WriteEndElement();
writer.WriteEndElement();
}
}
#endregion
}
解决方案
只需使用您的类SerializableDictionary< string,List< string>>而不是
字典<字符串,列表<字符串>>
样本:
< pre lang =c#> SerializableDictionary< string,List< string>> b = new SerializableDictionary< string,List< string>>();
List< string> stringList = new List< string>();
stringList.Add( 1);
b.Add( One,stringList);
XmlSerializer serializer = new XmlSerializer( typeof (SerializableDictionary< string,List<串GT;>));
TextWriter textWriter = new StreamWriter( @ dictionarySerialized.xml跨度>);
serializer.Serialize(textWriter,b);
textWriter.Close();
尝试通过BinaryFormatter进行序列化
这是代码
private void 反序列化()
{
尝试
{
var f_fileStream = File.OpenRead( @ dictionarySerialized.xml);
var f_binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
myDictionary =(字典<字符串,> )f_binaryFormatter.Deserialize(f_fileStream);
f_fileStream.Close();
}
catch (例外情况)
{
;
}
}
私有 void Serialize()
{
尝试
{
var f_fileStream = new FileStream( @ dictionarySerialized.xml,FileMode .Create,FileAccess.Write);
var f_binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
f_binaryFormatter.Serialize(f_fileStream,myDictionary);
f_fileStream.Close();
}
catch (例外情况)
{
;
}
}
I have Dictionary
Dictionary<string, List<string>> Dic = new Dictionary<string, List<string>>();
How serialize it with this class ?
Class for Serialization
[XmlRoot("Dictionary")]
public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, 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
}
解决方案
Just use your classSerializableDictionary<string, List<string>>instead of
Dictionary<string, List<string>>
Sample:
SerializableDictionary<string, List<string>> b = new SerializableDictionary<string, List<string>>(); List<string> stringList = new List<string>(); stringList.Add("1"); b.Add("One", stringList); XmlSerializer serializer = new XmlSerializer(typeof(SerializableDictionary<string, List<string>>)); TextWriter textWriter = new StreamWriter(@"dictionarySerialized.xml"); serializer.Serialize(textWriter, b); textWriter.Close();
Try Serializating through BinaryFormatter
Here is code
private void Deserialize() { try { var f_fileStream = File.OpenRead(@"dictionarySerialized.xml"); var f_binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); myDictionary = (Dictionary<string,>)f_binaryFormatter.Deserialize(f_fileStream); f_fileStream.Close(); } catch (Exception ex) { ; } } private void Serialize() { try { var f_fileStream = new FileStream(@"dictionarySerialized.xml", FileMode.Create, FileAccess.Write); var f_binaryFormatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); f_binaryFormatter.Serialize(f_fileStream, myDictionary); f_fileStream.Close(); } catch (Exception ex) { ; } }
这篇关于在c#中序列化字典的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文