序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。

序列化一个对象

为了序列化一个对象,我们需要一个被序列化的对象,一个容纳被序列化了的对象的(字节)流和一个格式化器。进行序列化之前我们先看看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里提供了两个格式化类:BinaryFormatterSoapFormatter,它们都继承了IFormatter接口。

使用序列化

序列化允许开发人员保存一个对象的状态并在需要的时候重构对象,同时很好地支持对象存储和数据交换。通过序列化,开发人员可以利用Web Service发送对象到远端应用程序,从一个域传输对象到另一个域,以XML的格式传输一个对象并能通过防火墙,或者在应用程序间保持安全性或用户特定信息等等。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们

转载于:https://www.cnblogs.com/rinack/p/3668873.html

C# 的三种序列化方法相关推荐

  1. Kryo,Hessain,Protostuff三种序列化方式对比

    前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...

  2. PHP开发之递归算法的三种实现方法

    递归算法对于任何一个编程人员来说,应该都不陌生.因为递归这个概念,无论是在PHP语言还是Java等其他编程语言中,都是大多数算法的灵魂.对于PHP新手来说,递归算法的实现原理可能不容易理解.但是只要你 ...

  3. 黑马程序员_Java解析网络数据流的三种特殊方法

    Java解析网络数据流的三种特殊方法 Java作为最开放的语言,已越来越受到网络程序员的青睐.但这一青睐族有着同样的经历--曾经都为网络上通信的Java数据格式而烦恼. 笔者也不例外,曾经为此而查阅了 ...

  4. Oracle的join默认为,Oracle中的三种Join方法详解

    这里将为大家介绍Oracle中的三种Join方法,Nested loop join.Sort merge join和Hash join.整理出来以便帮助大家学习. 基本概念 Nested loop j ...

  5. python中保留小数_python保留小数位的三种实现方法

    前言 保留小数位是我们经常会碰到的问题,尤其是刷题过程中.那么在python中保留小数位的方法也非常多,但是笔者的原则就是什么简单用什么,因此这里介绍几种比较简单实用的保留小数位的方法: 方法一:fo ...

  6. oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念 Nested loop join: Outer - phpStudy...

    浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...

  7. lopa分析_【风险分析方法】HAZOP、LOPA和FMEA三种分析方法,如何做到信息共享?...

    导 读 信息是人们对事物的了解的不确定性的减少或消除,其功能是表征物质客体成分,结构,状态,特性等属性.信息共享的目的在于减少或消除信息源所需的不确定性.石油化工行业由于设备多,生产过程复杂,危险元素 ...

  8. php怎么四舍五入,php 四舍五入的三种实现方法

    这篇文章主要为大家详细介绍了php 四舍五入的三种实现方法,具有一定的参考价值,可以用来参考一下. 对php 四舍五入的三种方法感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! php 四 ...

  9. java map集合遍历方法,Java的Map集合的三种遍历方法

    集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 1. package com.myTest.MapText; import java.util.Collection; i ...

最新文章

  1. BGP、MPLS是怎么组合到一起的?
  2. RxJava2学习笔记(3)
  3. 展望二十一世纪第三个十年
  4. 高斯信道、单径Rayleigh信道和多径衰落信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)
  5. poj3714 最近点对
  6. ajax成功跨域_自己写的
  7. MyEclipse在删除文件后servers报错问题解决
  8. mapxtreme java manger web 应用程序牛刀小试
  9. 【Python笔记】网络爬虫——常用框架介绍以及 Scrapy 框架使用
  10. magento url rewrite规则
  11. YUV通过MediaCodec编码H264
  12. python 自动下载脚本之家,python网页自动化脚本私服过验证
  13. 孙鑫老师的帮助文档 MSDN Library 2001January 下载地址
  14. win7升级RDP至8.1
  15. Android获取分辨率和像素密度
  16. oracle产生连续的数字
  17. 信息系统规划方法-业务流程再造(BPR)
  18. OpenSSH 用户枚举漏洞(CVE-2018-15919)服务器修复方法(亲测实用)
  19. FPGA 译码器+解码器 (含代码)
  20. iceoryx(冰羚)-IPC中间件交叉编译

热门文章

  1. rpm怎样在win安装mysql_centos7.6安装mysql的正确步骤
  2. 怎么用计算机不会卡,电脑卡顿不流畅怎么解决?
  3. 微信按钮android代码实现原理,微信小程序button标签open-type实现原理
  4. 多表连接去重复 mysql_连接多个表时避免重复条目(MySQL)
  5. java 中文符号占位_java – ‘占位符’字符以避免积极比较?
  6. 安装esp8266库_基于ESP8266,DIY低成本智能远程开关灯小装置
  7. python基础---元组、字典、函数、文件、异常
  8. 齐次坐标的理解(2)
  9. halcon与QT联合:(5.3)瓶盖检测以及QT界面搭建
  10. Leetcode 552.学生出勤记录‖ 动态规划+容斥