C#: XML Serializer
这里主要讲如何将一个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的更多相关文章
- JS:XML
一 IE中的XML //1.创建XMLDOM对象 //创建XMLDOM对象 var xmlDom = new ActiveXObject("MSXML2.DOMDocument.6.0&qu ...
- 【ASP.NET Web API教程】6.2 ASP.NET Web API中的JSON和XML序列化
谨以此文感谢关注此系列文章的园友!前段时间本以为此系列文章已没多少人关注,而不打算继续下去了.因为文章贴出来之后,看的人似乎不多,也很少有人对这些文章发表评论,而且几乎无人给予“推荐”.但前几天有人询 ...
- [玩转微信平台]XML的格式化- 如何去掉XML 文档头和命名空间
前言 系统要求能够回复微信用户发过来的文本消息.实现中使用的实体对象进行XML的序列化的方式来实现XML消息. 微信平台的回复例子 http://mp.weixin.qq.com/wiki/14/ ...
- C#对象与XMl文件之间的相互转换
C#提供三种序列化方式,分别为: 1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于Binar ...
- Java JSON、XML文件/字符串与Bean对象互转解析
前言 在做web或者其他项目中,JSON与XML格式的数据是大家经常会碰见的2种.在与各种平台做数据对接的时候,JSON与XML格式也是基本的数据传递格式,本文主要简单的介绍JSON/XML ...
- Android中序列化对象到XMl 和 XML反序列化为对象
package com.example.xmloperation; import java.io.File; import java.io.FileOutputStream; import java. ...
- android xml操作
import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import ...
- Java更新XML的四种常用方法简介
本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣.其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述. JAXP是Java API for X ...
- Simple XML
官网:http://simple.sourceforge.net/home.php 截止目前最新版本:simple-xml-2.7.1.jar 特点: jar lib文件只有360K左右的大小 它的使 ...
随机推荐
- android studio 编程中用到的快捷键
1.Ctrl+Alt+T可以把代码包在一块内,例如try/catch Version:0.9 StartHTML:-1 EndHTML:-1 StartFragment:0000000111 EndF ...
- 搭建C语言开发环境
大学的时候有数据结构这门课,但...终究还是得学.电脑是win8的,根据网上的教程倒是能安装成功vc6.0并且能够打开新建工程,但是一编译运行就提示兼容性问题. 首先安装C语言编译器.下载MinGw ...
- volatile in thread
public class TestCalc { public static void main(String[] args) { class StoppableThread extends Threa ...
- yum change source repo centos共存安装sun jdk6和jdk7
之前一直使用的是163的源,今天从微博看到阿里云推出了自己的源.因为我的主机是阿里云,所以可以走内网,速度提升更快.过程如下:cd /etc/yum.repos.d/mv mv CentOS-Base ...
- 【Android开发学习笔记】【第五课】Activity的生命周期-上
今天学习Activity当中的七个生命周期函数: 首先得说一个事情,就是在代码当中如果加入了 System.out.println(" ------");之后,如何查看这里面的输出 ...
- css模仿表格 居中
<div class="service_box"><div class="service_list"> <span class=& ...
- 【C++】error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
刷leetcode 263.uglynumber时,代码如下: class Solution { public: bool isUgly(int num) { int temp = num; ) re ...
- 获取微信服务器IP地址
关键字:微信公众平台 微信服务器 IP地址 如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表. 接口调用请求说明 http请求方式 ...
- Python线程指南
本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2.4完成,:如果看到不明白的词汇请记得百度谷 ...
- Bash中的shopt选项
Bash中的shopt选项 http://blog.chinaunix.net/uid-20587169-id-1919110.html shopt命令用于显示和设置shell中的行为选项,通过这些选 ...