`

Dictionary序列化和反序列化

    博客分类:
  • C#
阅读更多
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            SerializableDictionary<string, string> obj = new SerializableDictionary<string, string>();
            obj.Add("1", "1ff");
            obj.Add("2", "2gg");
            obj.Add("3", "3yy");

            StringWriter _memory = new StringWriter();
            XmlSerializer formatter = new XmlSerializer(obj.GetType());
            formatter.Serialize(_memory, obj);

            //_memory.Seek(0, SeekOrigin.Begin);
            StringReader sr = new StringReader(_memory.ToString());
            SerializableDictionary<string, string> obj2 = (SerializableDictionary<string, string>)formatter.Deserialize(sr);
            _memory.Close();
        }
    }

    /// <summary>
    /// 标题:支持 XML 序列化的 Dictionary
    /// </summary>
    /// <typeparam name="TKey"></typeparam>
    /// <typeparam name="TValue"></typeparam>
    [XmlRoot("SerializableDictionary")]
    public class SerializableDictionary<TKey, TValue>
      : Dictionary<TKey, TValue>, IXmlSerializable
    {
        #region 构造函数

        public SerializableDictionary()
            : base()
        {
        }

        public SerializableDictionary(IDictionary<TKey, TValue> dictionary)
            : base(dictionary)
        {
        }

        public SerializableDictionary(IEqualityComparer<TKey> comparer)
            : base(comparer)
        {
        }

        public SerializableDictionary(int capacity)
            : base(capacity)
        {
        }

        public SerializableDictionary(int capacity, IEqualityComparer<TKey> comparer)
            : base(capacity, comparer)
        {
        }

        protected SerializableDictionary(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }

        #endregion 构造函数

        #region IXmlSerializable Members

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }

        /// <summary>
        /// 从对象的 XML 表示形式生成该对象
        /// </summary>
        /// <param name="reader"></param>
        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();
        }

        /**/

        /// <summary>
        /// 将对象转换为其 XML 表示形式
        /// </summary>
        /// <param name="writer"></param>
        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 IXmlSerializable Members
    }
}
分享到:
评论

相关推荐

    Dictionary序列化源码 datatable序列化源码

    本篇将详细讲解标题和描述中提到的`Dictionary`和`DataTable`的序列化与反序列化方法。 首先,让我们了解`Dictionary, TValue&gt;`。`Dictionary`是.NET中的一个内置类,它实现了键值对的存储,通常用于创建关联数据...

    VB.NET XML和JSON序列化与反序列化

    在VB.NET编程环境中,XML和JSON序列化与反序列化是常见的数据处理技术,用于将对象转换为文本格式(XML或JSON),以便于存储、传输和解析。这两者都是轻量级的数据交换格式,广泛应用于Web服务和客户端应用程序之间...

    hashtable序列化与反序列化

    在IT领域,序列化和反序列化是两个关键的概念,特别是在处理对象持久化、网络传输或数据存储时。本文将详细探讨标题所提及的“hashtable序列化与反序列化”,并提供一个基本的示例。 首先,让我们理解什么是序列化...

    C#序列化与反序列化(包括复杂xml对象)

    在C#编程中,序列化和反序列化是两个关键的概念,它们主要用于对象状态的持久化和恢复。本文将深入探讨C#中的XML序列化和反序列化技术,包括如何将XML文档解析为对象,以及如何将对象转换回XML文档进行存储。我们将...

    C#自定义可序列化的Dictionary类型

    ReadXml方法用于从XML文件中读取数据,我们需要使用XmlSerializer来反序列化键和值。 ```csharp public void ReadXml(System.Xml.XmlReader reader) { XmlSerializer keySerializer = new XmlSerializer(typeof(T...

    JSON的序列化与反序列化

    利用JSON.NET制作的,对JSON文本进行序列化和反序列化操作的类,可反序列化成实体类或Dictionary,也可从类或Dictionary序列化成JSON文本

    序列化,反序列化,接口

    序列化和反序列化是计算机科学中的重要概念,特别是在数据存储、网络通信和对象持久化等领域。接口在编程中则扮演着定义规范和提供抽象的角色。让我们深入了解一下这些概念。 **序列化** 是将对象的状态转换为可...

    xml 和C#序列化与反序列化

    ### XML与C#中的序列化和反序列化 在C#开发中,序列化和反序列化是非常重要的技术,它们可以将对象的状态保存为一种持久化的格式,以便于存储或在网络上传输。本文将深入探讨如何使用XML进行序列化与反序列化,并...

    unity字典序列化工具SerializableDictionary

    3. **序列化和反序列化方法**:为了配合Unity的序列化流程,`SerializableDictionary`类需要包含特殊的属性或方法,比如`[SerializeField]`标记的私有字段,以及可能的`OnBeforeSerialize()`和`OnAfterDeserialize()...

    C#自定义序列化ISerializable的实现方法

    ISerializable接口是.NET Framework提供的一种自定义序列化的方式,允许开发者精确控制对象的序列化和反序列化过程。下面我们将详细讲解如何在C#中实现自定义序列化,特别是通过ISerializable接口。 首先,让我们看...

    反射泛型序列化(.net版)PPT

    在.NET框架中,反射、泛型和序列化是三个核心概念,它们对于开发高效、灵活且可维护的应用程序至关重要。让我们深入探讨这三个概念及其在.NET编程中的应用。 **反射** 反射是.NET框架提供的一种强大机制,它允许在...

    C#序列化(二)二进制序列化的案例 c#经典案例.pdf

    本文主要探讨的是二进制序列化,这是一种常见的序列化方式,尤其适用于需要高效、紧凑地保存和恢复数据的情况。我们将通过一个WinForm程序的案例来深入理解这一过程。 案例中,我们有一个简单的日记应用,它使用...

    c#序列化完成电影票销售系统

    C#提供了System.Runtime.Serialization命名空间,其中的BinaryFormatter、XmlSerializer等类可以实现对象的序列化和反序列化。序列化不仅方便了数据的保存,还能实现跨应用程序域的数据传输。 接着,**泛型集合**在...

    C#中datatable序列化与反序列化实例分析

    本篇文章将详细讲解如何在C#中实现 `DataTable` 的序列化和反序列化。 首先,让我们了解什么是序列化和反序列化。序列化是指将对象的状态转化为可持久化的格式,如JSON、XML等,以便存储或在网络中传输。反序列化则...

    iOS objective-c 实体类对象的序列化为Json及反序列化

    Objective-C的实体类对象序列化和反序列化是数据处理的关键环节,它涉及到如何将内存中的对象转换为可存储或传输的数据格式,如JSON(JavaScript Object Notation),以及如何将接收到的JSON数据还原为对象。...

    xml文件序列化

    6. **集合序列化**:`List&lt;T&gt;`、`Dictionary, TValue&gt;`等集合类型可以自动序列化,但也可以使用`[XmlArray]`和`[XmlArrayItem]`进行自定义。 总之,XML文件序列化是软件开发中常用的数据持久化手段,它使得对象的...

    C# 单文件存放多个序列化对象

    请注意,为了确保兼容性和数据一致性,你应该始终记录序列化和反序列化时使用的类版本和格式。此外,对于敏感数据,应该考虑加密序列化的结果,以提高安全性。 总的来说,通过理解C#中的序列化机制,我们可以有效地...

    CommonsCollection7反序列化链学习.doc

    - **Hashtable**:`Hashtable`是Java的一个类,实现了`Map`接口并继承自`Dictionary`类,同时也实现了`Serializable`接口,这意味着它可以被序列化和反序列化。与`HashMap`类似,`Hashtable`用于存储键值对,但它是...

    序列化与集合窗体应用

    在“序列化与集合窗体应用”项目中,可能涵盖了如何将集合对象(如ArrayList或Dictionary)进行序列化,然后保存到文件或数据库中。这在处理大量数据时非常有用,因为可以直接读取序列化的数据,避免了重新计算或...

    unity3d-ordered-dictionary:用于将有序字典添加到自定义`ScriptableObject`和`MonoBehaviour`类的库,只要键和值类型可序列化,可通过Unity对其进行序列化

    用于在自定义ScriptableObject和MonoBehaviour类中添加有序词典的库,只要键和值类型是可序列化的,就可以由Unity进行序列化。 $ yarn add rotorz/unity3d-ordered-dictionary 该软件包与工具兼容。 有关将程序​...

Global site tag (gtag.js) - Google Analytics