.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中的对象序列化 (转)
序列化是指将对象实例的状态存储到存储媒体的过程,在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转 换为字节流,然后再把字节流写入数据流,在随后对对象进行反序列化时,将创建出 ...
随机推荐
- 1. 参数的传入和添加 argparse.ArgumentParser()
# Edit configuration 传入的参数使用的是--file_dir picture, 获取使用的是argv.file_dir import argparse, sys def parse ...
- 如何在form组件中添加一个单选或者多选的字段
解决办法: 需要在增加的类里面加入choices 具体操作如下:
- IMDB Classification on Keras
IMDB Classification on Keras In the book of Deep Learning with Python, there is an example of IMDB m ...
- Junit : how to add listener, and how to extends RunListener to override behaviors while failed
http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html org.junit.runner ...
- Echarts 里面获取纵坐标刻度的间距
概述 今天 PM 说,需要把 echarts 图表的纵坐标调成这样:如果全是 4 位数就用 K 为单位.冷静分析,就是说如果纵坐标刻度的间距是四位数,就用 K 为单位.那要如何获取纵坐标刻度的间距呢? ...
- 因修改/etc/ssh权限导致的ssh不能连接异常解决方法
因修改/etc/ssh权限导致的ssh不能连接异常解决方法 现象: $ssh XXX@192.168.5.21 出现以下问题 Read from socket failed: Connection r ...
- Horizon Web管理界面
一.horizon 介绍: Horizon 为 Openstack 提供一个 WEB 前端的管理界面 (UI 服务 )通过 Horizone 所提供的 DashBoard 服务 , 管理员可以使用通过 ...
- codeblocks无法识别的16位程序解决方法
被codeblocks心态搞崩了,分享一下经验给大家,具体就是无法运行编译好的程序,还有就是调试功能没法用. 查了很多资料,自己搞了一个终极解决方法:1卸载codeblocks,2打开我的电脑,全盘搜 ...
- 数据库SQL语句查询指定时间段内的数据
[摘要]有的时候,我们需要查询数据库某段时间之间的数据,比如2016年5月1号到到5月3号之间用户注册数量(特殊节假日期间)等.那么用SQL语句如何实现呢? 首先,数据表中的存时间的字段比如是addt ...
- nodejs版本控制:nvm use命令失效
Downloading npm version ... Download failed. Rolling Back. Rollback failed. remove C:\Users\Administ ...