这里主要讲如何将一个class序列化为一个string。如下一个class:

 public class OrderedItem
     {
         private string itemName;
         private string description;
         private decimal unitPrice;
         private int quantity;
         public string ItemName
         {
             get { return itemName; }
         }
         public string Description
         {
             get { return description; }
         }
         public decimal UnitPrice
         {
             get { return unitPrice; }
         }
         public int Quantity
         {
             get { return quantity; }
         }
         public Dictionary<string, int> Data { get; set; }
         public OrderedItem(string itemName, string description, decimal unitPrice, int quantity)
         {
             this.itemName = itemName;
             this.description = description;
             this.unitPrice = unitPrice;
             this.quantity = quantity;
         }
     }

可以用stringSerializer来实现:

 class StringSerializer
     {
         public static string Serialize<T>(T t)
         {
             using (StringWriter sw = new StringWriter())
             {
                 XmlSerializer xz = new XmlSerializer(t.GetType());
                 xz.Serialize(sw, t);
                 return sw.ToString();
             }
         }
         public static object Deserialize(Type t, string s)
         {
             using (StringReader sr = new StringReader(s))
             {
                 XmlSerializer xz = new XmlSerializer(t);
                 return xz.Deserialize(sr);
             }
         }
     }

这里会有这么几个问题:

1. Dictionary并不直接支持序列化,因此需要包装一下,如下:

 public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
     {
         public XmlSchema GetSchema()
         {
             throw new NotImplementedException();
         }
         public void ReadXml(XmlReader reader)
         {
             XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
             XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
             bool isEmpty = reader.IsEmptyElement;
             reader.Read();
             if (isEmpty)
                 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();
             }

         }
     }

2. 被序列化的类必须有无参的构造函数。

3. 属性访问器必须有get和set。

最后OrderedItem类应如下所示

 public class OrderedItem
     {
         private string itemName;
         private string description;
         private decimal unitPrice;
         private int quantity;
         public string ItemName
         {
             get { return itemName; }
             set { itemName = value; }
         }
         public string Description
         {
             get { return description; }
             set { description = value; }
         }
         public decimal UnitPrice
         {
             get { return unitPrice; }
             set { unitPrice = value; }
         }
         public int Quantity
         {
             get { return quantity; }
             set { quantity = value; }
         }
         public SerializableDictionary<string, int> Data { get; set; }
         public OrderedItem()
         {
         }
         public OrderedItem(string itemName, string description, decimal unitPrice, int quantity)
         {
             this.itemName = itemName;
             this.description = description;
             this.unitPrice = unitPrice;
             this.quantity = quantity;
         }
     }

可以测试一下:

 class Program
     {
         static void Main(string[] args)
         {
             OrderedItem test = );
             test.Data = new SerializableDictionary<string, int>();
             test.Data.Add();
             test.Data.Add();
             string str = StringSerializer.Serialize(test);
             Console.WriteLine(str);
             OrderedItem result = StringSerializer.Deserialize(typeof(OrderedItem), str) as OrderedItem;
             Console.WriteLine("result: " +
                 "\n\t ItemName: " + result.ItemName +
                 "\n\t Description: " + result.Description +
                 "\n\t UnitPrice: " + result.UnitPrice +
                 "\n\t Quantity: " + result.Quantity +
                 "\n\t Data: ");
             foreach (var item in result.Data)
             {
                 Console.WriteLine("\t Key: " + item.Key + "\t Value: " + item.Value);
             }
         }

     }

结果如下:

C#: XML Serializer的更多相关文章

  1. JS:XML

    一 IE中的XML //1.创建XMLDOM对象 //创建XMLDOM对象 var xmlDom = new ActiveXObject("MSXML2.DOMDocument.6.0&qu ...

  2. 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化

    谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...

  3. [玩转微信平台]XML的格式化- 如何去掉XML 文档头和命名空间

    前言 系统要求能够回复微信用户发过来的文本消息.实现中使用的实体对象进行XML的序列化的方式来实现XML消息.   微信平台的回复例子 http://mp.weixin.qq.com/wiki/14/ ...

  4. C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...

  5. Java JSON、XML文件/字符串与Bean对象互转解析

    前言      在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...

  6. Android中序列化对象到XMl 和 XML反序列化为对象

    package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...

  7. android xml操作

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import ...

  8. Java更新XML的四种常用方法简介

    本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣.其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述. JAXP是Java API for X ...

  9. Simple XML

    官网:http://simple.sourceforge.net/home.php 截止目前最新版本:simple-xml-2.7.1.jar 特点: jar lib文件只有360K左右的大小 它的使 ...

随机推荐

  1. 鸡肋的Drools

    在看过Drools例子之后,认为其太鸡肋. 完全可以用bshell脚本来代替,或者用java自带的脚本(java5以上才支持,不过不是太好用)代替. 规则文件还要学其新标签,与其配套的接口写那么多,还 ...

  2. cookie函数

    function getcookie(){ var cookie={}; var all=document.cookie; if(all===""){ alert(2); retu ...

  3. 低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层

    链路层定义设备处于状态机中五种状态的一种: (1)旁路状态: 处于此状态下的设备不发送或接收数据,处于其它状态下都可以转到此状态. (2)广告状态: 处于此状态的设备发送广播包或者监听.响应广播包.可 ...

  4. 低功耗蓝牙4.0BLE编程-nrf51822开发(1)

    为了省钱,也为了提高手动能力,只买了块核心板,仿真器用的是旧的jinkv7,自己搭扩展板,DIY就这样开始了. 买这块之前做了些调查,最终选定了nrf51822,功耗低,性能强,开发难度小,虽然比TI ...

  5. 使用C++还是QML

    本质上,Qt 是一个C++类库.在引入 QML 以前,所有的开发都是基于 C++ 的,但到了 Qt 5,QML 和 Qt Quick 成为了 Qt 的核心之一,导致很多初学者在犹豫是否还需要学习 C+ ...

  6. php---初学者git使用

    1.git自学网站 廖雪峰的官方网站 2.安装一个简单的git 创建用户名.邮箱 git config --global user.name "your name" git con ...

  7. 是什么在.NET程序关闭时阻碍进程的退出?

    在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在 ...

  8. android监听屏幕打开关闭广播无响应的情况

    android在屏幕打开和关闭的时候会发出广播,但是如果receiver配置在AndroidManifest.xml中时,receiver是接受不到任何广播的. <receiver androi ...

  9. QRadioButton

    #include "dialog.h" #include "ui_dialog.h" #include <QtCore> #include < ...

  10. 7Z命令行

    7-Zip (A) 4.57 Copyright (c) 1999-2007 Igor Pavlov 2007-12-06 Usage: 7za <command> [<switch ...