c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的区别
在C#中常见的序列化的方法主要也有三个:BinaryFormatter、SoapFormatter、XML序列化
1.BinaryFormatter
序列化
[Serializable] //如果要想保存某个class中的字段,必须在class前面加个这样attribute(C#里面用中括号括起来的标志符)
public class Person
{
public int age; public string name; [NonSerialized] //如果某个字段不想被保存,则加个这样的标志 public string secret; } class Program
{
static void Main(string[] args)
{ Person person = new Person(); person.age = ; person.name = "tom"; person.secret = "i will not tell you"; FileStream stream = new FileStream(@"c:\temp\person.dat", FileMode.Create); BinaryFormatter bFormat = newBinaryFormatter(); bFormat.Serialize(stream, person); stream.Close();
}
}
反序列化
Person person = new Person(); FileStream stream = new FileStream(@"c:\temp\person.dat", FileMode.Open); BinaryFormatter bFormat = new BinaryFormatter(); person = (Person)bFormat.Deserialize(stream);//反序列化得到的是一个object对象.必须做下类型转换 stream.Close(); Console.WriteLine(person.age + person.name + person.secret);//结果为18tom.因为secret没有有被序列化.
2.SoapFormatter
把数据保存成xml文件.里面除了保存的内容还有些额外的Soap信息.它的用法和BinaryFormatter一样.只要把BinaryFormatter都替换成SoapFormatter就行.
把文件名改为person.xml
另外就是添加名称空间:using System.Runtime.Serialization.Formatters.Soap;
这个名称空调对就的程序集有时VS没有自动引用.你必须手动去引用.选中project,右击选择Add Reference.在.NET的标签下选择
System.Runtime.Serialization.Formatters.Soap.然后点OK.
补充:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
3.XmlSerializer
也是保存成XML文件.但没有其他额外信息.另外它只能保存public类型的字段.而其他两种类型能保存所以类型的字段.
序列化
Person person = new Person(); person.age = ; person.name = "tom"; person.secret = "i will not tell you"; FileStream stream = new FileStream(@"c:\temp\xmlFormat.xml", FileMode.Create); XmlSerializer xmlserilize = new XmlSerializer(typeof(Person)); xmlserilize.Serialize(stream, person); stream.Close();
反序列化
Person person = new Person(); FileStream stream =new FileStream(@"c:\temp\xmlFormat.xml",FileMode.Open); XmlSerializerxmlserilize = new XmlSerializer(typeof(Person)); person = (Person)xmlserilize.Deserialize(stream); stream.Close(); Console.WriteLine(person.age + person.name + person.secret);
总结:
两个的用法大致如下:
序列化:
1.得到一个存储对象的类型
2.创建一个写入文件流
3.定义要序列化的类型
4.调用序列化方法
反序列化:
1.定义一个装载对象的类型
2.创建一个读出文件流
3.定义要反序列化的类型
4.调用反序列化方法
BinaryFormatter类进行序列化和反序列化,以缩略型二进制格式写到一个文件中去,速度比较快,而且写入后的文件已二进制保存有一定的保密效果。标记为NonSerialized的其他所有成员都能序列化。
采用xml序列化的方式只能保存public的字段和可读写的属性,对于private等类型的字段不能进行序列化。
二进制序列化的优点:
1. 所有的类成员(包括只读的)都可以被序列化;
2. 性能非常好。
XML序列化的优点:
1. 互操作性好;
2. 不需要严格的二进制依赖;
3. 可读性强
SoapFormatter微软淘汰了,,不能序列化泛型,这里就不多讲了。
c# 序列化BinaryFormatter、SoapFormatter和XmlSerializer的区别的更多相关文章
- 谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter、SoapFormatter、XmlSerializer还是BinaryReader
谁能在同一文件序列化多个对象并随机读写(反序列化)?BinaryFormatter.SoapFormatter.XmlSerializer还是BinaryReader 随机反序列化器 +BIT祝威+悄 ...
- wcf中序列化BinaryFormatter,DataContractJsonSerializer,DataContractSerializer,SoapFormatter,XmlSerializer
using System; using System.Runtime.Serialization; using System.Xml.Serialization; namespace Larryle. ...
- C# 二进制序列化(BinaryFormatter),Xml序列化(XmlSerializer),自己模拟写一个Xml序列化过程。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C# 实体类序列化与反序列化一 (XmlSerializer)
/// <summary> /// 实体类序列化的反序列化的类 /// </summary> /// <typeparam name="T">& ...
- .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)
序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...
- asp.net中对象的序列化,方便网络传输
对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...
- .net 序列化与反序列化
1.序列化 反序列化 C#中如果需要:将一个结构很复杂的类的对象存储起来,或者通过网路传输到远程的客户端程序中去,这时就需要用到序列化,反序列化(Serialization & Deseria ...
- XmlSerializer 对象的Xml序列化和反序列化
http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...
- XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置
这篇随笔对应的.Net命名空间是System.Xml.Serialization:文中的示例代码需要引用这个命名空间. 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中:内存中 ...
随机推荐
- java使用md5加密
代码: public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingExcep ...
- FXML Stuffs (include and define)
FXML Stuffs (include and define)Hello folks,Today I would like to blog about the FXML define and inc ...
- 【C++ Primer 第六章】 1. 定义模板
类模板 题目描述:实现StrBlob的模板版本. /* Blob.h */ #include<iostream> #include<vector> #include<in ...
- JS高级 - 面向对象1(this,Object ,工厂方式,new )
面向对象三要素: 封装 继承 多态 1.this 详解,事件处理中this的本质 window this -- 函数属于谁 <script type="text/javascript& ...
- PowerDesigner表创建脚本双引号问题
在使用PowerDesigner表属性的Preview查看创建脚本的时候,发现大多表名和字段名都加上了双引号,而且有引号的都是大小写混合的,导致创建的表里,表名和字段名也都是大小写混合的. 在一番搜索 ...
- [转]oracle10客户端PL/SQL Developer如何连接远程服务器上的oracle数据库
时间:2013年8月21日 前提条件:假设你已经安装好了oracle和PL/SQL Developer,知道远程服务器的IP和数据库端口,知道远程服务器上的oracle数据库名和密码 如何用PL/SQ ...
- 6-15 给任务排序 uva10305
拓扑排序的水题 有关dfs的很好的题 其中c数组的三个状态十分巧妙 还有各种bool的运用 储存答案的方式!!:ans[--t]=x; 因为dfs是先将所有的步骤全部进行完 最后开始疯狂 存答案 ...
- 【Java】 剑指offer(47) 礼物的最大价值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值( ...
- 013 JstlView
一:InternalResourceViewResolver 1.InternalResourceViewResolver JSP是常见的视图技术,可以使用InternalResourceViewRe ...
- QT学习之菜单栏与工具栏
QT学习之菜单栏与工具栏 目录 简单菜单栏 多级菜单栏 上下菜单栏 工具栏 简单菜单栏 程序示例 from PyQt5.QtWidgets import QApplication, QMainWind ...