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左右的大小 它的使 ...
随机推荐
- 初始Spring
Spring框架概述 1.什么是Spring struts2----是web层框架,围绕请求和响应 Hibernate----是持久层框架,围绕业务的增删改查 Spring是分层的JavaSE/EE ...
- C、VDD、VSS、 VEE 和VPP的区别
http://www.cnblogs.com/crazybingo/archive/2010/05/14/1735802.html C.VDD.VSS. VEE 和VPP的区别 在电子电路中,常可以看 ...
- VCL自带的TabControl真心不好用...
不是说功能, 而是指自绘能力, 开启OwnerDraw以后, 画是可以画了, 可是为啥每个Tab页头的边框不能变捏 只能是灰秃秃的, 感觉很不和谐 RZ的TabControl很强大, 可惜想用它需要带 ...
- SHELL 八大扩展
最近在梳理bash知识的的过程中,有幸阅读了man bash文档,一时间犹如醍醐灌顶一般,很多当初不明白的地方都豁然开朗,现在就其中的一点做一分享,同时也为man bash做一下广告,当你面对bash ...
- mysql import data slow solution---overview information
1 SELECT SUM(DATA_LENGTH)+SUM(INDEX_LENGTH) FROM information_schema.tables WHERE TABLE_SCHEMA='dat ...
- 对于HIVE架构的理解
1.Hive 能做什么,与 MapReduce 相比优势在哪里 关于hive这个工具,hive学习成本低,入手快,对于熟悉sql语法的人来说,操作简单,熟悉. 2.为什么说 Hive 是 Hadoo ...
- Qt中单例模式的实现(4种方法)
最简单的写法: 12345 static MyClass* MyClass::Instance(){ static MyClass inst; return &inst;} 过去很长一段时间一 ...
- 【Java 基础篇】【第二课】基本数组类型
就像第一章所说一样,这次学习为了快,因此说明性的文字就不想写太多了,直接帖代码吧,代码当中尽量加一些注释: package a.b; public class test { static void B ...
- KVO机制浅析和实例演示
什么是KVO? KVO是Key-Value-Observing的缩写,通过KVO这种机制对象可以通过它得到其他对象的某个属性的变更通知.这种机制在MVC模式下显得更为重要,KVO可以让视图对象经过控制 ...
- css背景图片定位练习(一)
首先准备一张雪碧图,Like this 背景图片的定位方法有3种,比较常用的两种为 关键字:background-position: top left; (top/bottom/cennter/lef ...