在c#中序列化字典 [英] Serialize Dictionary in c#

查看:424
本文介绍了在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 class

SerializableDictionary<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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆