.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这两个文件。
转载于:https://www.cnblogs.com/gyc19920704/p/6543492.html
.net中对象序列化技术相关推荐
- Day10_07目标:对象序列化技术
目标:对象序列化技术 对象序列化:就是把Java对象数据直接存储到文件中去. 对象 => 文件中 对象反序列化:把Java对象的文件数据恢复到Java对象中. 文件中 => 对象 字节流 ...
- Swift中对象序列化的实现
Swift中对象序列化的实现 在swift中要使某个类可以序列化,只需要类实现NSCoding协议,并实现协议中的一个必要的构造函数和一个方法,分别对应序列化和反序列化的二个过程. //提供一个解 ...
- android 序列化存储对象,android中对象序列化存储
项目中要存储一些数据为了提高不必要的网络请求,提高效率,用到数据持久化的知识点,针对这个问题,解决办法其实有很多,以前在项目中是服务获取到webservice的xml,然后直接将xml保存在本地,之后 ...
- 【六祎 - Java】对象序列化
目标:对象序列化技术.对象序列化:就是把Java对象数据直接存储到文件中去. 对象 => 文件中对象反序列化:就是把Java对象的文件数据恢复到Java对象中. 文件中 => 对象字节流 ...
- .Net高级技术——对象序列化
对象序列化 "序列化是将一个对象保存到存储介质上或者将对象进行转换使之能够在网络上传送的行为".通俗一点的解释,序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是从文 ...
- js 序列化内置对象_内置序列化技术
js 序列化内置对象 本文是我们名为" 高级Java "的学院课程的一部分. 本课程旨在帮助您最有效地使用Java. 它讨论了高级主题,包括对象创建,并发,序列化,反射等. 它将指 ...
- 对象序列化Java中的序列化
首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 当两个进程在停止远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都市以二进制序列的情势在络网上传送.发送方需要把这个Java对 ...
- [Java] 序列化(Serialization)的本质是什么?在Java中怎么实现?为什么要了解序列化技术?序列化技术选型要点是什么?
文章目录 前言 序列化是什么? 理解对象在内存中是如何存储的 数据在进程内存中的分布图 数据被序列化之后在内存中的分布图 序列化/反序列化的本质? 序列化在Java中的实现? 1. JDK Seria ...
- java培训教程分享:Java中怎样将数据对象序列化和反序列化?
本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...
- .NET 中的对象序列化 (转载)
.NET 中的对象序列化 Piet Obermeyer Microsoft Corporation 2001 年 8 月 摘要:为什么要使用序列化?最重要的两个原因是:将对象的状态保存在存储媒体中以便 ...
最新文章
- 杨森翔的书法:书法 马凯诗
- YUV / RGB 格式及快速转换
- android fragment addtobackstack,Android Fragment Back Stack的问题
- ReactNative 踩坑之 iOS 原生组件
- Leecode刷题热题HOT100(14)——最长公共前缀
- php开源Plogger用法
- 「一本通 4.1 例 3」校门外的树 (loj10115)
- 系统故障模拟及修复实验
- steam密码查看_如何查看和清除Steam中的先前别名
- flutter集成高德地图
- 删除idb无法启动 mysql 数据库
- android 抽奖动画下载,召唤抽奖系统正式版
- 华为hicar 鸿蒙,华为智能座舱的野心:HiCar上车,为鸿蒙OS铺路
- input和textarea设置placeholder属性的颜色、字体大小
- Package javax.naming
- [Excel常用函数] var var.p var.s函数
- android vcf iphone6,安卓通讯录导入到iphon最简单的方式(安卓通讯录导入iphon
- 暑假到了,如何有效保护眼睛?盘点保护视力的护眼台灯
- 【Git从青铜到王者】第三篇:Git的基础
- 炒股,你必须弄明白这9个问题
热门文章
- python中strptime函数_python datetime中strptime用法详解
- ORA-04031:unable to allocate 4120 bytes of shared memory ‘obj stat mem’故障解决
- [Mongodb]安装与启动
- java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错(转)
- Markdown语法 (中文版)
- 黄聪:wordpress向mysql字段中保存html代码(使用add_option()方法),然后无法显示出问题...
- jquery ui accordion的详细参数
- 重装XP后无法启动LINUX的解决方案
- 基础矩阵,本质矩阵,单应性矩阵讲解,在ORB-SLAM相机的位姿初始化的应用
- Stanford NLP - 命名实体识别 - NERClassifierCombiner