.net中对象序列化技术
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件中“恢复”对象到序列化之前的状态。
在.net中有提供了几种序列化的方式:
二进制序列化
XML序列化
SOAP序列化
二进制序列化
所谓二进制序列化,指的是对象序列化之后是二进制形式的。二进制序列化是通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下。
XML序列化
所谓XML序列化,是指对象序列化之后的结果是XML形式的。保存XML序列化是通过XmlSerializer 类来实现的, 这个类位于System.Xml.Serialization命名空间下。
SOAP序列化
所谓SOAP序列化是指对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP协议传输(不知道SOAP协议?百度一下吧)。SOAP序列化是通过SoapFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Soap命名空间下,并且需要注意需要手动添加对这个命名空间的引用。
下面编写一个类用于序列化和反序列化,这个类的代码如下:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace MySerializeDemo
- {
- [Serializable]
- /// <summary>
- /// 要序列化的对象
- /// 作者:周公
- /// 编写时间:2009-03-10
- /// </summary>
- public class MyObject
- {
- //[NonSerialized]
- private string name;
- private DateTime birthday;
- private string homePlace;
- /// <summary>
- /// 出生地
- /// </summary>
- public string HomePlace
- {
- get { return homePlace; }
- set { homePlace = value; }
- }
- /// <summary>
- /// 生日
- /// </summary>
- public DateTime Birthday
- {
- get { return birthday; }
- set { birthday = value; }
- }
- /// <summary>
- /// 姓名
- /// </summary>
- public string Name
- {
- get { return name; }
- set { name = value; }
- }
- /// <summary>
- /// 年龄
- /// </summary>
- public int Age
- {
- get { return DateTime.Now.Year - birthday.Year; }
- }
- /// <summary>
- /// override了ToString()方法
- /// </summary>
- /// <returns></returns>
- public override string ToString()
- {
- return string.Format("姓名:{0},生日:{1},出生地:{2},年龄:{3}",name,birthday,homePlace,Age);
- }
- }
- }
下面是分别用上面的三个类进行序列化和反序列化的代码:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.IO;
- using System.Runtime.Serialization.Formatters;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Runtime.Serialization.Formatters.Soap;
- using System.Xml.Serialization;
- namespace MySerializeDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- MyObject obj = new MyObject();
- obj.Birthday = new DateTime(1979, 11, 7);
- obj.HomePlace = "湖北";
- obj.Name = "周公";
- Console.WriteLine("========使用BinaryFormatter类进行序列化和反序列化。====");
- BinarySerialize(obj);
- BinaryDeserialize("C://MyObject.dat");
- Console.WriteLine("========使用SoapFormatter类进行序列化和反序列化。====");
- SOAPSerialize(obj);
- SOAPDeserialize("C://MyObject.soap");
- Console.WriteLine("========使用XmlSerializer类进行序列化和反序列化。====");
- XMLSerialize(obj);
- XMLDeserialize("C://MyObject.xml");
- }
- /// <summary>
- /// 二进制序列化对象
- /// </summary>
- /// <param name="obj"></param>
- public static void BinarySerialize(MyObject obj)
- {
- using (FileStream stream = new FileStream("C://MyObject.dat", FileMode.Create, FileAccess.Write))
- {
- BinaryFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, obj);
- Console.WriteLine("对象已经被序列化。" + obj.ToString());
- }
- }
- /// <summary>
- /// 二进制反序列化
- /// </summary>
- /// <param name="fileName"></param>
- public static void BinaryDeserialize(string fileName)
- {
- using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- BinaryFormatter formater = new BinaryFormatter();
- MyObject obj=(MyObject)formater.Deserialize(stream);
- Console.WriteLine("对象已经被反序列化。" + obj.ToString());
- }
- }
- /// <summary>
- /// 二进制序列化对象
- /// </summary>
- /// <param name="obj"></param>
- public static void SOAPSerialize(MyObject obj)
- {
- using (FileStream stream = new FileStream("C://MyObject.soap", FileMode.Create, FileAccess.Write))
- {
- SoapFormatter formater = new SoapFormatter();
- formater.Serialize(stream, obj);
- Console.WriteLine("对象已经被序列化。" + obj.ToString());
- }
- }
- /// <summary>
- /// 二进制反序列化
- /// </summary>
- /// <param name="fileName"></param>
- public static void SOAPDeserialize(string fileName)
- {
- using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- SoapFormatter formater = new SoapFormatter();
- MyObject obj = (MyObject)formater.Deserialize(stream);
- Console.WriteLine("对象已经被反序列化。" + obj.ToString());
- }
- }
- /// <summary>
- /// XML序列化
- /// </summary>
- /// <param name="obj"></param>
- public static void XMLSerialize(MyObject obj)
- {
- using (FileStream stream = new FileStream("C://MyObject.xml", FileMode.Create, FileAccess.Write))
- {
- XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
- serializer.Serialize(stream, obj);
- Console.WriteLine("对象已经被序列化。" + obj.ToString());
- }
- }
- /// <summary>
- /// XML反序列化
- /// </summary>
- /// <param name="fileName"></param>
- public static void XMLDeserialize(string fileName)
- {
- using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
- {
- XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
- MyObject obj = (MyObject)serializer.Deserialize(stream);
- Console.WriteLine("对象已经被反序列化。" + obj.ToString());
- }
- }
- }
- }
可见通过上面三个类都能实现将对象序列化保存,并且都能反序列化还原到对象被序列化之前的状态(这正是序列化意义所在,能保存对象运行时的状态并且还能还原)。如果运行上面的代码会在C盘根目录下创建三个文件,分别是MyObject.dat、MyObject.soap和MyObject.xml文件,因为MyObject.dat是二进制文件,所以无法查看文件的内容,但是我们可以打开MyObject.soap和MyObject.xml这两个文件。
.net中对象序列化技术的更多相关文章
- .net中对象序列化技术浅谈
.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储 ...
- Java对象序列化剖析
对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...
- asp.net中对象的序列化,方便网络传输
对象序列化 是将对象状态转换为可保持或传输的格式的过程.反序列化 是将流转换为对象序列化和反序列化相结合 可以使对象数据轻松的存储和传递 在 .NET 中,如果是对象可序列化,需要在 声明对象的开始部 ...
- .Net高级技术——对象序列化
对象序列化 “序列化是将一个对象保存到存储介质上或者将对象进行转换使之能够在网络上传送的行为”.通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是从文件或者数据库中取出数 ...
- 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路
序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...
- Android中数据的传递以及对象序列化
Android中当两个Activity需要有信息交互的时候,可以使用Intent.具体来说: 发送单一类型数据: 发送方: String data = "Hello SecondActivi ...
- 【译】Java中的对象序列化
前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...
- C#[Serializable]在C#中的作用-NET 中的对象序列化
为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本:按值将对象从一个应用程序域发送至另一个应用程序域.例如,序列化可用于在 ASP.NET 中保 ...
- Serializable在C#中的作用.net中的对象序列化 (转)
序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...
随机推荐
- 监控部署nagios+snmp
参看是否有安装:rpm -q gcc glibc glibc-common gd gd-devel xinetd openssl-devel 未安装基础支持套件的先安装: yum install -y ...
- 在java poi导入Excel通用工具类示例详解
转: 在java poi导入Excel通用工具类示例详解 更新时间:2017年09月10日 14:21:36 作者:daochuwenziyao 我要评论 这篇文章主要给大家介绍了关于在j ...
- gradle自动刷新
1.gradle每次更新build.gradle都要刷新一下才能下载依赖 这样显得不太方便. 2.可以在Preferences修改配置来达到自动刷新的目的 如图所示,直接勾选即可,自动同步项目
- Synchronized知道这些就可以了
Synchronized关键字算是Java的元老级锁了,一开始它撑起了Java的同步任务,其用法简单粗暴容易上手.但是有些与它相关的知识点还是需要我们开发者去深入掌握的.比如,我们都知道通过Synch ...
- cocos2dx基础篇(24) 场景切换效果CCTransitionScene
[3.x] (1)去掉 "CC" (2)卡牌翻转 TransitionFlip 中的样式 tOrientation // //1: kCCTransitionOri ...
- 【计算机视觉】阶编码本模型(Multi phase codebook model)
转自:http://www.cnblogs.com/xrwang/archive/2012/04/24/MPCBBGM.html 多阶编码本模型(Multi phase codebook model) ...
- 【VS开发】免费打工仔:一个完善的ActiveX Web控件教程
作者 David Marcionek. 翻译 免费打工仔 这个教程可以帮助你快速开发一个ActiveX控件.其中将要讲解关于ActiveX开发的一些基础概念,诸如方法(method).属性(prope ...
- 第六次学习总结&&第四次实验总结
Java实验报告 班级 1班 学号 20188390 姓名 宋志豪 实验四 类的继承 1.实验目的 (1)掌握类的继承方法: (2)变量的继承和覆盖,方法的继承.重载和覆盖实现: 2.实验内容 实验代 ...
- 如何使用 re模块的, spilt.
例: 这是一组 网卡的信息. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopb ...
- POJ2387 Til the Cows Come Home (最短路 dijkstra)
AC代码 POJ2387 Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to ...