在c#中,如何序列化/反序列化一个字典对象?

.Net提供的各种序列化的类,通过使用这些类,. Net对象的序列化和反序列化变得很容易。但是字典对象的序列化并不是那么容易。为此,您必须创建一个能够序列化自身的特殊Dictionary类。在不同的业务案例中,序列化技术可能不同。

今天,让我们通过一个示例讨论如何实现序列化/反序列化。代码在文章中共享,您可以在应用程序中使用。继续阅读,如果你有其他方法,请告诉我。

要序列化dictionary对象,首先需要创建一个自定义dictionary类,实现IXmlSerializable接口。该接口包含三个方法,分别是GetSchema、ReadXml、WriteXml。您需要在这些方法中实现逻辑。以下是完整的代码供您参考:

        [XmlRoot("Languages")]        
        public class LanguageSettings<TKey, TValue> : Dictionary<TKey, TValue>, 
                                                      IXmlSerializable
        {
            public XmlSchema GetSchema() { return null; }
        
            public void ReadXml(XmlReader reader)
            {
                if(reader.IsEmptyElement) { return; }
        
                reader.Read();
                while (reader.NodeType != XmlNodeType.EndElement)
                {
                    object key = reader.GetAttribute("Title");
                    object value = reader.GetAttribute("Value");
                    this.Add((TKey)key, (TValue)value);
                    reader.Read();
                }
            }
        
            public void WriteXml(XmlWriter writer)
            {
                foreach (var key in this.Keys)
                {
                    writer.WriteStartElement("Language");
                    writer.WriteAttributeString("Title", key.ToString());
                    writer.WriteAttributeString("Value", this[key].ToString());
                    writer.WriteEndElement();
                }
            }
        }

在上面的代码片段中,您可以看到我们将对象序列化为XML属性。如果您有不同的业务需求,您可以将其更改为根元素类型。

自定义字典类就绪后,就可以开始将dictionary对象编写为XML文件。下面是用XmlSerializer API实现函数性的逻辑:

            XmlSerializer serializer = new XmlSerializer(typeof(LanguageSettings<string, string>));            
            TextWriter textWriter = new StreamWriter(@"languages.xml");
            serializer.Serialize(textWriter, settings);
            textWriter.Close();

您还可以使用XmlSerializer读取XML并将其反序列化到dictionary对象中。您需要使用TextReader从XML文件中读取输入流。

这里的代码片段:

            XmlSerializer serializer = new XmlSerializer(typeof(LanguageSettings<string, string>));            
            TextReader textReader = new StreamReader(@"languages.xml");
            LanguageSettings<string, string> settings = 
                              (LanguageSettings<string, string>)serializer.Deserialize(textReader);
            textReader.Close();

我希望这篇文章很有用,并且您可以直接使用项目中的共享代码片段将Dictionary对象序列化/反序列化到/从XML文件。请在下面的评论部分分享你对这篇文章的反馈。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-08-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闻道于事

Oracle数据库 拾漏补缺

select语句的基本使用 可以查询需要的列,行,可以进行多表链接,连接查询。 ? select e.*,e.sal/30 from p_emp e selec...

35380
来自专栏landv

C语言_函数【转】

49830
来自专栏抠抠空间

Python基础(一)

一、Python的简介 1、Python的由来与版本 1.1 python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum)。1...

43090
来自专栏Android知识点总结

06--图解数据结构之并查集

12430
来自专栏Android相关

X86 Assemble指令--MOVS指令簇

该指令簇包括: MOVS mem16,mem16:显式指定源操作数与目的操作数 MOVSB:每次移动一个字节 MOVSW:每次移动一个字 MOVSD:每...

15620
来自专栏程序员的知识天地

Python程序员必备的30个编程技巧

直接交换2个数字的位置 Python 提供了一种直观的方式在一行代码中赋值和交换(变量值)。如下所示:

16920
来自专栏专注 Java 基础分享

字节码文件的内部结构之谜

如果计算机的 CPU 只有「x86」这一种,或者操作系统只有 Windows 这一类,那么或许 Java 就不会诞生。Java 诞生之初就曾宣扬过它的初衷,「一...

40790
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版3.8节栈布局之栈溢出coredump例子

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

11320
来自专栏GreenLeaves

Proxy代理模式(结构型模式)

在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失...

13530
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列16-jdbc、hibernate、流、线程实现、多态、继承事程序执行顺序等

1 JDBC,Hibernate 分页怎样实现? 方法分别为: 1) Hibernate 的分页: Query query = session.createQ...

29430

扫码关注云+社区

领取腾讯云代金券