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网页开发 ...
随机推荐
- MySQL 数据类型 详解 (转载)
数值类型 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数.许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指 ...
- 在Linux下进行磁盘分区
1. 分区前的规划 2. 查看本机上的磁盘信息 3. 对第二个磁盘进行交换式分区操作(输入m为帮助信息) 图 1:n为新建分区 图 2:p为 ...
- log4net自定义字段写入SqlServer数据库 ASP.net
首先申明,本示例经过本作者亲自试验通过,可以运行 第一步 编写log4net配置文件 此处为Log.xml,该文件放在与Web.config平级的位置 <?xml version="1 ...
- UI2_IOS坐标系
// // AppDelegate.m // UI2_IOS坐标系 // // Created by zhangxueming on 15/6/29. // Copyright (c) 2015年 z ...
- 9 款赏心悦目的 HTML5/CSS3 特效
1.HTML5 WebGL实验,超酷的HTML5 Canvas波浪墙 这是一款HTML5 Canvas实验项目,也是波浪特效,只是这不是真正的水波,而是利用柱体高度的变化实现的波浪墙效果. 在线演示 ...
- POJ 2287 Tian Ji -- The Horse Racing(贪心)
题意:田忌和齐王有n匹马,进行n局比赛,每局比赛输者给胜者200,问田忌最多能得多少钱. 分析:如果田忌最下等的马比齐王最下等的马好,是没必要拿最下等的马和齐王最好的马比的.(最上等马同理) 因此,如 ...
- Ubuntu下MySQL忘记root密码重置
MySQL忘记root密码肿么办?-_-||| 这种情况虽然不是很常见,但是有时长时间没有登录系统,还真会忘记密码.这时候,如果您能以系统管理员权限登陆密码,那还是有救的.放大招,将其重置即可. ...
- jquery的change 事件
jquery的change 事件 . <script src="jquery.min.js" type="text/javascript">< ...
- Linux--变量与虚拟内存
定义一个变量:存储类型 数据类型 变量名 存储类型(变量存储的位置):auto.register.static.extern 1.auto:对于局部变量,atuo可以缺省.位置:栈 2.exter ...
- JQuery插件开发 - 模板
(function($) { $.fn.PluginName = function(options) { // 创建一个默认设置对象 var defaults = { key : "Defa ...