C# 的三种序列化方法
序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。
序列化一个对象
为了序列化一个对象,我们需要一个被序列化的对象,一个容纳被序列化了的对象的(字节)流和一个格式化器。进行序列化之前我们先看看System.Runtime.Serialization名字空间。ISerializable接口允许我们使任何类成为可序列化的类。
如果我们给自己写的类标识[Serializable]特性,我们就能将这些类序列化。除非类的成员标记了[NonSerializable],序列化会将类中的所有成员都序列化。
序列化的类型
- 二进制(流)序列化
- SOAP序列化
- XML序列化
二进制(流)序列化:
二进制(流)序列化是一种将数据写到输出流,以使它能够用来自动重构成相应对象的机制。二进制,其名字就暗示它的必要信息是保存在存储介质上,而这些必要信息要求创建一个对象的精确的二进制副本。在二进制(流)序列化中,整个对象的状态都被保存起来,而XML序列化只有部分数据被保存起来。为了使用序列化,我们需要引入System.Runtime.Serialization.Formatters.Binary名字空间. 下面的代码使用BinaryFormatter类序列化.NET中的string类型的对象。
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary;namespace SerializationTest {class Program{static void Main(string[] args){//Serialization of String Object string strobj = "test string for serialization";FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,FileShare.None);BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(stream, strobj);stream.Close();//Deserialization of String ObjectFileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,FileShare.Read );string readdata = (string)formatter.Deserialize(readstream);readstream.Close();Console.WriteLine(readdata);Console.ReadLine();}} }
SOAP序列化:
SOAP协议是一个在异构的应用程序之间进行信息交互的理想的选择。我们需要在应用程序中添加System.Runtime.Serialization.Formatters.Soap名字空间以便在.Net中使用SOAP序列化。SOAP序列化的主要优势在于可移植性。SoapFormatter把对象序列化成SOAP消息或解析SOAP消息并重构被序列化的对象。下面的代码在.Net中使用SoapFormatter类序列化string类的对象。
using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Soap ;namespace SerializationTest{class Program{static void Main(string[] args){//Serialization of String Object string strobj = "test string for serialization";FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,FileShare.None);SoapFormatter formatter = new SoapFormatter();formatter.Serialize(stream, strobj);stream.Close();//Deserialization of String ObjectFileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,FileShare.Read );string readdata = (string)formatter.Deserialize(readstream);readstream.Close();Console.WriteLine(readdata);Console.ReadLine();}} }
XML序列化:
根据MSDN的描述,“XML序列化将一个对象或参数的公开字段和属性以及方法的返回值转换(序列化)成遵循XSD文档标准的XML流。因为XML是一个开放的标准,XML能被任何需要的程序处理,而不管在什么平台下,因此XML序列化被用到带有公开的属性和字段的强类型类中,它的这些发生和字段被转换成序列化的格式(在这里是XML)存储或传输。”
我们必须添加System.XML.Serialization引用以使用XML序列化。使用XML序列化的基础是XmlSerializer。下面的代码是在.Net中使用XmlSerializer类序列化string对象。
using System; using System.IO; using System.Xml.Serialization;namespace SerializationTest {class Program{static void Main(string[] args){//Serialization of String Object string strobj = "test string for serialization";FileStream stream = new FileStream("C:\\StrObj.txt", FileMode.Create, FileAccess.Write ,FileShare.None);XmlSerializer xmlserializer = new XmlSerializer(typeof(string));xmlserializer.Serialize(stream, strobj);stream.Close();//Deserialization of String ObjectFileStream readstream = new FileStream("C:\\StrObj.txt", FileMode.Open , FileAccess.Read ,FileShare.Read );string readdata = (string)xmlserializer.Deserialize(readstream);readstream.Close();Console.WriteLine(readdata);Console.ReadLine();}} }
什么是格式化器?
一个格式化器用来确定一个对象的序列格式。它们目的是在网络上传输一个对象之前将其序列化成合适的格式。它们提供IFormatter接口。在.NET里提供了两个格式化类:BinaryFormatter和SoapFormatter,它们都继承了IFormatter接口。
使用序列化
序列化允许开发人员保存一个对象的状态并在需要的时候重构对象,同时很好地支持对象存储和数据交换。通过序列化,开发人员可以利用Web Service发送对象到远端应用程序,从一个域传输对象到另一个域,以XML的格式传输一个对象并能通过防火墙,或者在应用程序间保持安全性或用户特定信息等等。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
转载于:https://www.cnblogs.com/rinack/p/3668873.html
C# 的三种序列化方法相关推荐
- Kryo,Hessain,Protostuff三种序列化方式对比
前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...
- PHP开发之递归算法的三种实现方法
递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...
- 黑马程序员_Java解析网络数据流的三种特殊方法
Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...
- Oracle的join默认为,Oracle中的三种Join方法详解
这里将为大家介绍Oracle中的三种Join方法,Nested loop join.Sort merge join和Hash join.整理出来以便帮助大家学习. 基本概念 Nested loop j ...
- python中保留小数_python保留小数位的三种实现方法
前言 保留小数位是我们经常会碰到的问题,尤其是刷题过程中.那么在python中保留小数位的方法也非常多,但是笔者的原则就是什么简单用什么,因此这里介绍几种比较简单实用的保留小数位的方法: 方法一:fo ...
- oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念
Nested loop join:
Outer - phpStudy...
浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...
- lopa分析_【风险分析方法】HAZOP、LOPA和FMEA三种分析方法,如何做到信息共享?...
导 读 信息是人们对事物的了解的不确定性的减少或消除,其功能是表征物质客体成分,结构,状态,特性等属性.信息共享的目的在于减少或消除信息源所需的不确定性.石油化工行业由于设备多,生产过程复杂,危险元素 ...
- php怎么四舍五入,php 四舍五入的三种实现方法
这篇文章主要为大家详细介绍了php 四舍五入的三种实现方法,具有一定的参考价值,可以用来参考一下. 对php 四舍五入的三种方法感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! php 四 ...
- java map集合遍历方法,Java的Map集合的三种遍历方法
集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 1. package com.myTest.MapText; import java.util.Collection; i ...
最新文章
- BGP、MPLS是怎么组合到一起的?
- RxJava2学习笔记(3)
- 展望二十一世纪第三个十年
- 高斯信道、单径Rayleigh信道和多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)
- poj3714 最近点对
- ajax成功跨域_自己写的
- MyEclipse在删除文件后servers报错问题解决
- mapxtreme java manger web 应用程序牛刀小试
- 【Python笔记】网络爬虫——常用框架介绍以及 Scrapy 框架使用
- magento url rewrite规则
- YUV通过MediaCodec编码H264
- python 自动下载脚本之家,python网页自动化脚本私服过验证
- 孙鑫老师的帮助文档 MSDN Library 2001January 下载地址
- win7升级RDP至8.1
- Android获取分辨率和像素密度
- oracle产生连续的数字
- 信息系统规划方法-业务流程再造(BPR)
- OpenSSH 用户枚举漏洞(CVE-2018-15919)服务器修复方法(亲测实用)
- FPGA 译码器+解码器 (含代码)
- iceoryx(冰羚)-IPC中间件交叉编译
热门文章
- rpm怎样在win安装mysql_centos7.6安装mysql的正确步骤
- 怎么用计算机不会卡,电脑卡顿不流畅怎么解决?
- 微信按钮android代码实现原理,微信小程序button标签open-type实现原理
- 多表连接去重复 mysql_连接多个表时避免重复条目(MySQL)
- java 中文符号占位_java – ‘占位符’字符以避免积极比较?
- 安装esp8266库_基于ESP8266,DIY低成本智能远程开关灯小装置
- python基础---元组、字典、函数、文件、异常
- 齐次坐标的理解(2)
- halcon与QT联合:(5.3)瓶盖检测以及QT界面搭建
- Leetcode 552.学生出勤记录‖ 动态规划+容斥