C#序列化与反序列化(Serialize,Deserialize)实例详解
本文实例讲述了C#序列化与反序列化(Serialize,Deserialize)实现方法。分享给大家供大家参考。具体分析如下:
如果要保存运行程序过程的数据要么保存到数据库中,要么新建一个普通的文件,然后把数据保存进去.但是这两者有个缺点就是,不能把原有数据的结构也保存进去.比如一个类中的字段值保存进去后再读取出来必须再解析下才行.序列化技术让你省去了解析的过程.保存后再读取时直接得到一个class
序列化的方式有三种:BinaryFormatter,SoapFormatter,XmlSerializer
1.BinaryFormatter
保存成二进制数据流.用法示例:
1
2
3
4
5
6
7
8
9
10
11
|
using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] //如果要想保存某个class中的字段,必须在class前面加个这样attribute(C#里面用中括号括起来的标志符) public class Person { public int age; public string name; [NonSerialized] //如果某个字段不想被保存,则加个这样的标志 public string secret; } |
序列化:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
classProgram { staticvoid Main( string [] args) { Person person = newPerson(); person.age = 18; person.name = "tom" ; person.secret = "i will not tell you" ; FileStream stream =newFileStream( @"c:\temp\person.dat" ,FileMode.Create); BinaryFormatter bFormat =newBinaryFormatter(); bFormat.Serialize(stream, person); stream.Close(); } |
反序列化:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
classProgram { staticvoid Main( string [] args) { Person person = newPerson(); FileStream stream =newFileStream( @"c:\temp\person.dat" ,FileMode.Open); BinaryFormatter bFormat =newBinaryFormatter(); person = (Person)bFormat.Deserialize(stream); //反序列化得到的是一个object对象.必须做下类型转换 stream.Close(); Console.WriteLine(person.age + person.name + person.secret); //结果为18tom.因为secret没有有被序列化. } |
2.SoapFormatter
把数据保存成xml文件.里面除了保存的内容还有些额外的Soap信息.它的用法和BinaryFormatter一样.只要把BinaryFormatter都替换成SoapFormatter就行.
把文件名改为person.xml
另外就是添加名称空间:using System.Runtime.Serialization.Formatters.Soap;
这个名称空调对就的程序集有时VS没有自动引用.你必须手动去引用.选中project,右击选择Add Reference.在.NET的标签下选择
System.Runtime.Serialization.Formatters.Soap.然后点OK.
补充:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议,它包括四个部分:SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例; SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;SOAP绑定(binding),使用底层协议交换信息。
3.XmlSerializer
也是保存成XML文件.但没有其他额外信息.另外它只能保存public类型的字段.而其他两种类型能保存所以类型的字段.
这里仍使用上面的Person类.
添加名称空间:
1
2
|
using System.IO; using System.Xml.Serialization; |
序列化:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
classProgram { staticvoid Main( string [] args) { Person person = newPerson(); person.age = 18; person.name = "tom" ; person.secret = "i will not tell you" ; FileStream stream =newFileStream( @"c:\temp\xmlFormat.xml" ,FileMode.Create); XmlSerializer xmlserilize = newXmlSerializer( typeof (Person)); xmlserilize.Serialize(stream, person); stream.Close(); } |
反序列化:
1
2
3
4
5
6
7
8
9
10
11
|
classProgram { staticvoid Main( string [] args) { Person person = newPerson(); FileStream stream =newFileStream( @"c:\temp\xmlFormat.xml" ,FileMode.Open); XmlSerializerxmlserilize = newXmlSerializer( typeof (Person)); person = (Person)xmlserilize.Deserialize(stream); stream.Close(); Console.WriteLine(person.age + person.name + person.secret); }
|
C#序列化与反序列化(Serialize,Deserialize)实例详解的更多相关文章
- 序列化与反序列化Serialize&Deserialize
序列化是指一个对象的实例可以被保存,保存成一个二进制串,当然,一旦被保存成二进制串,那么也可以保存成文本串了.比如,一个计数器,数值为2,我们可以用字符串“2”表示.如果有个对象,叫做connter, ...
- C# XML序列化与反序列化与XML格式详解
1.https://www.cnblogs.com/sandyliu1999/p/4844664.html XML是有层次结构的,序列化实际就是内存化,用连续的结构化的内存来存储表示一个对象,那么这两 ...
- php对象复制、clone、浅复制与深复制实例详解
php对象复制.clone.浅复制与深复制实例详解 一.用clone(克隆)来复制对象$obj1 = new Object();$obj2 = clone $obj1;clone方法会触发对象里定义的 ...
- linux基础-磁盘阵列(RAID)实例详解
磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 R ...
- Cocos2d-x 3.X手游开发实例详解
Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...
- JavaScript学习笔记-实例详解-类(二)
实例详解-类(二) //===给Object.prototype添加只读\不可枚举\不可配置的属性objectId(function(){ Object.defineProperty(Object ...
- JavaScript学习笔记-实例详解-类(一)
实例详解-类(一): //每个javascript函数(除了bind())都自动拥有一个prototype对象// 在未添加属性或重写prototype对象之前,它只包含唯一一个不可枚举属性const ...
- Entity Framework实例详解
Entity Framework Code First的默认行为是使用一系列约定将POCO类映射到表.然而,有时候,不能也不想遵循这些约定,那就需要重写它们.重写默认约定有两种方式:Data Anno ...
- 免费的HTML5连载来了《HTML5网页开发实例详解》连载(二)
最近新浪.百度.腾讯.京东.大众点评.淘宝等流行的网站都加大了招聘HTML5的力度,HTML5开发人员成了抢手货,本次连载的是由大众点评前端工程师和一淘网前端工程师基情奉献的<HTML5网页开发 ...
随机推荐
- java创建Date日期时间笔记
(1)public Date() 创建的日期类对象的日期时间被设置成创建时刻相对应的日期时间. 例: Java代码 1.Date today=new Date(); //today被设置成创建时刻相 ...
- [老老实实学WCF] 第七篇 会话
老老实实学WCF 第七篇 会话 通过前几篇的学习,我们已经掌握了WCF的最基本的编程模型,我们已经可以写出完整的通信了.从这篇开始我们要深入地了解这个模型的高级特性,这些特性用来保证我们的程序运行的高 ...
- XibDemo
//// MyviewViewController.h// XibDemo//// Created by hehe on 15/9/21.// Copyright (c) 2015年 wang ...
- 如何系统地学习Node.js?
转载自知乎:http://www.zhihu.com/question/21567720 ------------------------------------------------------- ...
- 20150226--WebForm中GridView
WebForm中的GridView的用法基本与winForm中的DataGridView一致, 其数据绑定的方法使用LinqDateSource 将GridView拖拽进网页中,出现以下格式: 自动套 ...
- 转载:简单介绍Python中的try和finally和with方法
用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能, 如果有任何问题, 比如文件无法打开, 或是读取出错, 那么在函数内需要 ...
- Windows下OpenCV的环境配置
首先去官网下载所需版本的OpenCV(我这里下载的是OpenCV2.4.9),然后安装(也就是解压缩)到某个地方(个人推荐解压到硬盘的根目录).解压完成后,可以得到如下的目录结构(版本不同,可能会有一 ...
- iOS Foundation框架 -2.常用集合类简单总结
Foundation框架中常用的类有:NSString.NSArray.NSSet.NSDictionary 以及它们对应的子类 NSMutableString.NSMutableArray.NSMu ...
- 用CSS实现Firefox 和IE 都支持的Alpha透明效果
有的时候,为了实现一些特殊效果,需要将页面元素变透明,本文介绍的就是用 CSS 实现 Firefox 和 IE 都支持的 Alpha 透明效果.CSS: filter:alpha(opacity=50 ...
- Window 8.1 计时器功能及图片切换
<Canvas Margin="450,0" Width="795" Grid.Column="1"> <Image Ma ...