C# 序列化和反序列化 详解
- 什么是序列化以及如何实现序列化?
- 如何将对象数据写入 XML 文件?
- 如何从 XML 文件读取对象数据?
什么是序列化以及如何实现序列化?
序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。

如上图所示,对象 object 被序列化为 流,其中不仅包含数据、还包含对象类型的相关信息,如版本、区域性和程序集名称。然后可以将此流中的内容存储到数据库、文件或内存中。
序列化的用途:
通过序列化,可以执行如下操作:通过 Web 服务将对象发送到远程应用程序、在域之间传递对象、以 XML 字符串的形式传递对象通过防火墙、跨应用程序维护安全性或用户专属信息。
让对象可序列化:
需要具有对象、包含已序列化对象的一个流,以及一个 Fromatter。
System.Runtime.Serialization 包含序列化和反序列化对象所必须的类。
将 SerializableAttribute 特性应用于某个类型,以表示此类型的实例可以被序列化,如果对没有 SerializableAttribute 特性的类型进行序列化,则会引发异常。
如果想让类中的某个字段不可序列化,可以使用 NonSerializedAttribute 特性。
序列化的三种类型--二进制、XML、JSON
可以使用二进制 binary 或 XML 进行序列化,在 二进制序列化中,所有内容都会被序列化,且性能也很好,使用二进制编码来生成精简的序列化,可以用于基于存储或socket的网络流。
XML 序列化可提高可读性,以及对象共享和使用的灵活性,XML 序列化将对象的公共字段和属性或方法的参数和返回值序列化成符合特定 XML 格式的流,
System.Xml.Serialization 包含序列化和反序列化 XML 所需要的类
如何将对象数据写入 XML 文件?
使用 XmlSerializer 类将 overview 对象序列化并写入 XML 文件
public class XMLWrite
{ static void Main(string[] args)
{
WriteXML();
} public class Book
{
public String title;
} public static void WriteXML()
{
Book overview = new Book();
overview.title = "Serialization Overview";
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(typeof(Book)); var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//SerializationOverview.xml";
System.IO.FileStream file = System.IO.File.Create(path); writer.Serialize(file, overview);
file.Close();
}
}
运行结果:
在当前系统的 Documents 文件夹下生成文件 SerializationOverview.xml
内容如下图:

指定 XML 标签的名字
[XmlRoot(department)]
public class Department {
public string DeptName { get; set; } [XmlElement("extra")]
public DeptExtraInfo DeptExtraInfo { get; set; }
}
通过在 XmlRoot、XmlElement 后面加上一个括号即可实现,其中XmlRoot用于指定“根”,也就是XML的最上一层的Tag
指定 XML 标签的属性
[XmlRoot("department")]
public class Department {
public string DeptName { get; set; } = "研发部";
[XmlAttribute("timestamp")]
public int Timestamp = ;
}
Timestamp就成为了department这个根节点的timestamp属性。
去掉不需要的 namespace
默认情况下,xml 的头部会带上类似 xmlns:xsd、xmlns:xsi 的属性,不需要的化可以通过修改序列化方法实现:
public static void WriteXML()
{
Book overview = new Book();
overview.title = "Serialization Overview";
System.Xml.Serialization.XmlSerializer writer =
new System.Xml.Serialization.XmlSerializer(typeof(Book));
XmlSerilizerNamespaces ns = new XmlSerializerNamespace();
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "//SerializationOverview.xml";
System.IO.FileStream file = System.IO.File.Create(path); writer.Serialize(file, overview, ns);
file.Close();
}
如何从 XML 文件读取对象数据?
使用 XmlSerializer 类读取之前写入 XML 文件的对象数据
public class Book
{
public String title;
} public void ReadXML()
{
// First write something so that there is something to read ...
var b = new Book { title = "Serialization Overview" };
var writer = new System.Xml.Serialization.XmlSerializer(typeof(Book));
var wfile = new System.IO.StreamWriter(@"c:\temp\SerializationOverview.xml");
writer.Serialize(wfile, b);
wfile.Close(); // Now we can read the serialized book ...
System.Xml.Serialization.XmlSerializer reader =
new System.Xml.Serialization.XmlSerializer(typeof(Book));
System.IO.StreamReader file = new System.IO.StreamReader(
@"c:\temp\SerializationOverview.xml");
Book overview = (Book)reader.Deserialize(file);
file.Close(); Console.WriteLine(overview.title); }
C# 序列化和反序列化 详解的更多相关文章
- go语言之行--文件操作、命令行参数、序列化与反序列化详解
一.简介 文件操作对于我们来说也是非常常用的,在python中使用open函数来对文件进行操作,而在go语言中我们使用os.File对文件进行操作. 二.终端读写 操作终端句柄常量 os.Stdin: ...
- .Net中的序列化和反序列化详解
序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中.反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程. 然而为什么需要序列化和反序列化这样的机制 ...
- 《Java基础知识》序列化与反序列化详解
序列化的作用:为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制. 序列化应用场景: 1. 分布式传递对象. 2. 网络传递对象. 3. tomcat关闭以后会把session对象序列 ...
- java Serializable和Externalizable序列化反序列化详解--转
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
- java Serializable和Externalizable序列化反序列化详解(转载)
一.什么是序列化? “对象序列化”(Object Serialization)是 Java1.1就开始有的特性. 简单地说,就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存 ...
- Java中的序列化Serialable高级详解
来自[http://blog.csdn.net/jiangwei0910410003/article/details/18989711] 引言 将 Java 对象序列化为二进制文件的 Java 序列化 ...
- Django序列化组件Serializers详解
本文主要系统性的讲解django rest framwork 序列化组件的使用,基本看完可以解决工作中序列化90%的问题,写作参考官方文档https://www.django-rest-framewo ...
- Serializers 序列化组件——ModelSerializer详解
前面学习Serializers用法时,发现所有的序列化都与我们的模型紧密相关. django_restframework也给我提供了跟模型紧密相关的序列化器——ModelSerializer. 它会根 ...
- tomcat session漏洞反序列化详解
1. 条件1)攻击者可以控制服务器上的文件名/文件内容2)tomcat context配置了persistencemanager的fileSotre3) persistenceManager 配置了s ...
随机推荐
- PHP重定向的三个方法
js的重定向方法:location.href=目标 url(如 https:www.baidu.com); php的重定向方法: header("location: https:www.ba ...
- sublime完美编码主题
Theme – Soda 使用Ctrl+Shift+P快捷键或者进入菜单:Preferences(首选项) - Package Control(插件控制),调出命令输入框,输入Install Pack ...
- linux 命令——18 locate (转)
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- 论overflow滚动的重要性
原理 设置一个块级作用域溢出的效果,只需要在外部块的位置上设置overflow:scroll和height:xx即可. 此时,块级作用域的内容位移超出外部块的位移就会出现滚动条,当内部块滚动时,我们能 ...
- java—三大框架详解,其发展过程及掌握的Java技术慨括
Struts.Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解决方案.但你是否知道,这些知名框架最初是怎样产生的? 我们知道,传统的Java W ...
- 初学树套树:线段树套Treap
前言 树套树是一个十分神奇的算法,种类也有很多:像什么树状数组套主席树.树状数组套值域线段树.\(zkw\)线段树套\(vector\)等等. 不过,像我这么弱,当然只会最经典的 线段树套\(Trea ...
- fopen, fdopen, freopen - 打开流
SYNOPSIS (总览) #include <stdio.h> FILE *fopen(const char *path, const char *mode); FILE *fdopen ...
- Problem D: 双向冒泡排序
Problem D: 双向冒泡排序 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 447 Solved: 197[Submit][Status][We ...
- 操作表单 -------JavaScrip
本文摘要:http://www.liaoxuefeng.com/ HTML表单的输入控件主要有以下几种: 文本框,对应的<input type="text">,用于输入 ...
- java基础面试题:java中实现多态的机制是什么?
靠的是父类或接口的引用指向子类或实现类的对象, 调用的方法是内存中正在运行的那个对象的方法.