这里主要讲如何将一个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左右的大小 它的使 ...
随机推荐
-
web.xml中webAppRootKey
------------------------------------------------------------------------------------------------1. w ...
-
poj 3792 Area of Polycubes (简单模拟)
题目 题意:在三维坐标系中,给定n个立方体的中心坐标,立方体的边长为1,按照输入顺序,后来输入的必须和之前输入的立方体有公共的边. 而且,不能和之前输入的立方体相同. 如果满足条件,输出表面积.如果不 ...
-
网络IPC:套接字之寻址
在学习用套接字做一些有意义的事情之前,需要知道如何确定一个目标通信进程. 进程的标识有两个部分:计算机的网络地址可以帮助标识网络上想与之通信的计算机,而服务可以帮助标识计算机上特定的进程. 1.字节序 ...
-
the introduction of scrapy1.1 tools
scrapy xxcommand:输出xxcommand的相关信息 help:scrapy的基本命令,用于查看帮助信息 version:查看版本信息,可见-V参数查看各组件的版本信息: startpr ...
-
Nodejs之编辑器ueditor
ueditor编辑器的使用说明. 最近在找nodejs前台界面可以编辑文字发表文章的工具,后来找到了ueditor,感觉还不错,就拿来使用了一下,使用过程如下. 1.下载及准备 下载ueditor,官 ...
-
Oracle表生成JavaBean
package com.batch.tabletojava import java.io.DataOutputStream; import java.io.File; import java.io.F ...
-
Ajax beforeSend和complete 方法
http://blog.csdn.net/chenjianandiyi/article/details/52274591 .ajax({ beforeSend: function(){ // Hand ...
-
python基础7之python3的内置函数
官方介绍: python3:https://docs.python.org/3/library/functions.html?highlight=built#ascii python2:https:/ ...
-
Dynamics CRM 产品视图列上自带按钮的隐藏
CRM中对command bar的处理都是使用ribbon workbench,但是很多系统自带的按钮你是没法在ribbon workbench看到的,咱们以产品为例,比如我要隐藏form上的保存按钮 ...
-
SVN迁移到GitLab,保留提交记录
1.下载GitBash 此工具自带git svn命令,无需再下载git-svn工具 2.GitBash终端中输入以下命令 git svn clone svnurl srcPath 3.push本地仓库 ...