NET对象的XML序列化和反序列化
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了。
比如,一个计数器,数值为2,我们可以用字符串“2”表示。
如果有个对象,叫做connter,当前值为2,那么可以序列化成“2”,反向的,也可以从“2”得到值为2的计数器实例。
这样,关机时序列化它,开机时反序列化它,每次开机都是延续的。不会都是从头开始。
序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便。
序列化有很多好处,比如,在一台机器上产生一个实例,初始化完毕,然后可以序列化,通过网络传送到另一台机器,然后反序列化,得到对象实例,之后再执行某些业务逻辑,得到结果,再序列化,返回第一台机器,第一台机器得到对象实例,得到结果。
这个例子是目前比较先进的“智能代理”的原理。
当前比较热火的web services使用soap协议,soap协议也是以对象的可序列化为基础的。
一 概述
.NET Framework为处理XML数据提供了许多不同的类库。XmlDocument类能让你像处理文件一样处理xml数据,而XmlReader、XmlWriter和它们的派生类使你能够将xml数据作为数据流处理。
XmlSerializer则提供了另外的方法,它使你能够将自己的对象串行化和反串行化为xml。串行化数据既能够让你像处理文件一样对数据进行随机处理,同时又能跳过你不感兴趣的数据。
二 主要类库介绍
.NET 支持对象xml序列化和反序列化的类库主要位于命名空间System.Xml.Serialization中。
1. XmlSerializer 类
该类用一种高度松散耦合的方式提供串行化服务。你的类不需要继承特别的基类,而且它们也不需要实现特别的接口。相反,你只需在你的类或者这些类的公共域以及读/写属性里加上自定义的特性。XmlSerializer通过反射机制读取这些特性并用它们将你的类和类成员映射到xml元素和属性。
2. XmlAttributeAttribute 类
指定类的公共域或读/写属性对应xml文件的Attribute。
例:[XmlAttribute(“type”)] or [XmlAttribute(AttributeName=”type”)]
3. XmlElementAttribute类
指定类的公共域或读/写属性对应xml文件的Element。
例:[XmlElement(“Maufacturer”)] or [XmlElement(ElementName=”Manufacturer”)]
4. XmlRootAttribute类
Xml序列化时,由该特性指定的元素将被序列化成xml的根元素。
例:[XmlRoot(“RootElement”)] or [XmlRoot(ElementName = “RootElements”)]
5. XmlTextAttribute 类
Xml序列化时,由该特性指定的元素值将被序列化成xml元素的值。一个类只允许拥有一个该特性类的实例,因为xml元素只能有一个值。
6. XmlIgnoreAttribute类
Xml序列化时不会序列化该特性指定的元素。
三 实例
下面例子中的xml schema 描述了一个简单的人力资源信息,其中包含了xml的大部分格式,如xml 元素相互嵌套, xml元素既有元素值,又有属性值。
1. 待序列化的类层次结构
[XmlRoot("humanResource")]
public class HumanResource
{
#region private data.
private int m_record = 0;
private Worker[] m_workers = null;
#endregion
[XmlAttribute(AttributeName="record")]
public int Record
{
get { return m_record; }
set { m_record = value; }
}
[XmlElement(ElementName="worker")]
public Worker[] Workers
{
get { return m_workers; }
set { m_workers = value; }
}
}
public class Worker
{
#region private data.
private string m_number = null;
private InformationItem[] m_infoItems = null;
#endregion
[XmlAttribute("number")]
public string Number
{
get { return m_number; }
set { m_number = value; }
}
[XmlElement("infoItem")]
public InformationItem[] InfoItems
{
get { return m_infoItems; }
set { m_infoItems = value; }
}
}
public class InformationItem
{
#region private data.
private string m_name = null;
private string m_value = null;
#endregion
[XmlAttribute(AttributeName = "name")]
public string Name
{
get { return m_name; }
set { m_name = value; }
}
[XmlText]
public string Value
{
get { return m_value; }
set { m_value = value; }
}
}
2. 序列化生成的xml结构
<?xml version="1.0" ?>
[url=file:///E:/humans.xml##]-[/url] <humanResource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" record="2">
[url=file:///E:/humans.xml##]-[/url] <worker number="001">
<infoItem name="name">Michale</infoItem>
<infoItem name="sex">male</infoItem>
<infoItem name="age">25</infoItem>
</worker>
[url=file:///E:/humans.xml##]-[/url] <worker number="002">
<infoItem name="name">Surce</infoItem>
<infoItem name="sex">male</infoItem>
<infoItem name="age">28</infoItem>
</worker>
</humanResource>
3. 利用XmlSerializer类进行序列化和反序列化的实现(一般利用缓存机制实现xml文件只解析一次。)
public sealed class ConfigurationManager
{
private static HumanResource m_humanResource = null;
private ConfigurationManager(){}
public static HumanResource Get(string path)
{
if (m_humanResource == null)
{
FileStream fs = null;
try
{
XmlSerializer xs = new XmlSerializer(typeof(HumanResource));
fs = new FileStream(path, FileMode.Open, FileAccess.Read);
m_humanResource = (HumanResource)xs.Deserialize(fs);
fs.Close();
return m_humanResource;
}
catch
{
if (fs != null)
fs.Close();
throw new Exception("Xml deserialization failed!");
}
}
else
{
return m_humanResource;
}
}
public static void Set(string path, HumanResource humanResource)
{
if (humanResource == null)
throw new Exception("Parameter humanResource is null!");
FileStream fs = null;
try
{
XmlSerializer xs = new XmlSerializer(typeof(HumanResource));
fs = new FileStream(path, FileMode.Create, FileAccess.Write);
xs.Serialize(fs, humanResource);
m_humanResource = null;
fs.Close();
}
catch
{
if (fs != null)
fs.Close();
throw new Exception("Xml serialization failed!");
}
}
}
四 说明
1. 需要序列化为xml元素的属性必须为读/写属性;
2. 注意为类成员设定缺省值,尽管这并不是必须的。
转载于:https://www.cnblogs.com/timoli/archive/2009/06/16/1503946.html
NET对象的XML序列化和反序列化相关推荐
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中的对 ...
- 开心网外挂开发之 XML序列化于反序列化
通过昨天的文章我们已经了解了开发一个开心网的外挂所需要的最基本的东本,接下来的工作可以说基本上就上围绕这个基础来进行的,我写这一系列文章主要的目地不仅仅是为了让大家了解怎么开发开心网外挂,最主要的目过 ...
- XML 序列化与反序列化
XML序列化与反序列化 1.将一个类转化为XML文件 /// <summary>/// 对象序列化成XML文件/// </summary>/// <param name= ...
- oracle存储过程如何传递一个bean对象_对象传输,序列化和反序列化
一.前言 二.基本概念 2.1 序列化和反序列化的定义及最重要的作用 序列化的定义:Java序列化就是指把Java对象转换为字节序列的过程: 反序列化的定义:Java反序列化就是指把字节序列恢复为Ja ...
- Xml序列化、反序列化帮助类
之前从网络上找了一个Xml处理帮助类,并整理了一下,这个帮助类针对Object类型进行序列化和反序列化,而不需要提前定义Xml的结构,把它放在这儿供以后使用 1 /// <summary> ...
- 序列化对象C++对象的JSON序列化与反序列化探索
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 一:背景 作为一名C++开发人员,我始终很期待能够像C#与JAVA那样,可以省力的进行对象的序列化与反序列化,但到现在为止,还没有找 ...
- IO流 (五) ----- 对象数据的序列化与反序列化
相关文章: <IO流 (一) ----- 基本概念和File类> <IO流 (二) ----- 文件流> <IO流 (三) ----- 字符流和字符缓冲流> < ...
- XML序列化和反序列化(C#)
主要参考资料: http://www.codeproject.com/Articles/483055/XML-Serialization-and-Deserialization-Part-1 http ...
- [WPF]xml序列化以及反序列化数据
代码 XML序列化工具类 public static class XMLHelper{/// <summary>/// 将对象序列化为指定的文件名/// </summary>/ ...
- C# XML 序列化 及 反序列化
百科:序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态, ...
最新文章
- python做一个考试系统_请用 Python 语言编写一个简易的系统登录程序。
- DeepLab v2的摘要部分(翻译加理解)
- MediaPlayer/MediaRecorder与AudioTrack/AudioRecord区别(三十九)
- OPTIMIZE TABLE的作用--转载
- python之路_自定义forms组件
- ROS防火墙规则收集
- messagebox
- 计算机常用代码大全,常用电脑命令大全【图文】
- 利用matlab实现卷积实验报告,matlab卷积实验报告(共8篇).doc
- 联想笔记本键盘亮屏幕不亮_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决...
- Linux之ES集群搭建
- Oracle优化的几个简单步骤
- 2020年阿里巴巴实习生线上笔试试题
- 8类网线利弊_7类网线和8类网线到底有何不同?
- 工程师的爱情故事之1:大发明家
- IEEE爬取摘要并翻译成中文
- requirejs+jquery表单验证
- 堆和栈内存扩展方向问题
- matlab输入一个3位整数,matlab随机产生一个3位整数,将它的十位数变为0。例如,输入738则输出708。...
- [CF14E]Camels
热门文章
- WinForm后台任务(定时任务)传递消息给主窗体并更新主窗体文本框内容
- sklearn svm 调参_用 Grid Search 对 SVM 进行调参
- awx文件解析,运用NCL处理风云卫星2E的AWX格式数据的总结
- VMware15下安装Ubuntu18.04
- mybatis-plus中的select
- linux apache php.ini,Linux Apache的.htaccess控制php.ini 与MIME类型
- html attr src,jQuery中css()和attr()方法的区别
- python语法使用方法_Python语法基础
- 24. Django部署:项目部署
- 谷粒商城:跨域问题解决