C#中的 序列化和反序列化
什么是序列化和反序列化?
序列化就是把一个对象保存到一个文件或数据库字段中去,反序列化就是在适当的时候把这个文件再转化成原来的对象使用。
我想最主要的作用有:
1、在进程下次启动时读取上次保存的对象的信息
2、在不同的AppDomain或进程之间传递数据
3、在分布式应用系统中传递数据
序列化概念的提出和实现,可以使我们的应用程序的设置信息保存和读取更加方便。
比如,在一台机器上产生一个实例,初始化完毕,然后可以序列化,通过网络传送到另一台机器,然后反序列化,得到对象实例,之后再执行某些业务逻辑,得到结果,再序列化,返回第一台机器,第一台机器得到对象实例,得到结果。
现在开始序列化的具体操作:
我们创建一个简单的类 Product:
[Serializable] //必须要有这个标记才能序列化,否则会产生异常
public class Product
{
public long Id;
public string Name;
public double Price; [NonSerialized] //这个特征表示这个属性不能被序列化,注意对比序列化后输出结果的差异
public string Notes; //构造函数,用于初始化对象
public Product(long id,string name ,double price,string notes)
{
Id = id;
Name = name;
Price = price;
Notes = notes;
} //重写的 ToString() 方法,用于输出对象
public override string ToString()
{
return string.Format("ID={0}, Name={1}, Price={2}, Notes={3}", Id, Name, Price, Notes);
}
}
- 第一种方式:使用 BinaryFormatter 类
然后再Main函数中:
class Program
{
static void Main(string[] args)
{ //将对象实例加入到泛型集合中
List<Product> products = new List<Product>();
products.Add(new Product(, "可口可乐", 12.12, "test1"));
products.Add(new Product(, "百事可乐", 11.11, "test2"));
products.Add(new Product(, "非常可乐", 10.11, "test3")); //输出泛型集合中的值
Console.WriteLine("输出Product类:");
foreach (var item in products)
{
Console.WriteLine(item);
} Console.WriteLine();
Console.WriteLine("-------------华丽的分割线--------------");
Console.WriteLine(); //序列化对象,将对象保存到文件中
IFormatter serializer = new BinaryFormatter(); //创建一个 BinaryFormatter 类
FileStream saveFile = new FileStream("Product2.bin", FileMode.Create, FileAccess.Write); //将流中的信息写入到 文件Product2.bin中
serializer.Serialize(saveFile, products); //调用 serializer 类的 Serialize()方法序列化该对象
saveFile.Close(); //关闭流 //反序列化对象,从文件中读出对象的值
FileStream loadFile = new FileStream("Product1.bin", FileMode.Open, FileAccess.Read);
List<Product> savedProduct = serializer.Deserialize(loadFile) as List<Product>; //反序列化
loadFile.Close(); Console.WriteLine("从文件中读出对象(序列化后的值):");
foreach (var item in savedProduct)
{
Console.WriteLine(item);
}
}
}
结果:
注意: 从结果中可以看出, Notes属性没有显示,因为我们在 Product类中给 Notes属性标明了 NoSerialized 特征,所以不能序列化该属性。
因为已经把对象的值存到文件 Product1.bin 中了,所以现在随时可以从该文件中反序列化对象的值了
你可以到项目文件夹中的 ..\bin\Debug 文件夹中找到生成的文件, Product1.bin 文件,打开后如图所示:
- 第二种方式: 使用 SoapFormatter 类 序列化为 Soap 格式的文件, 从文件中反序列化和第一种方法一样,所以这里不再列出
class Program
{
static void Main(string[] args)
{ // SOAP 序列化
Product products = new Product(, "百事可乐", 12.12, "test1");
SoapFormatter serializer2 = new SoapFormatter(); //创建SoapFormatter类的实例
FileStream saveFile2 = new FileStream("Product10.soap", FileMode.Create, FileAccess.Write);
serializer2.Serialize(saveFile2, products);//调用Serialize()方法
saveFile2.Close();
}
}
..\bin\Debug 文件夹查看文件内容得到:
- 第三种方式: 使用 XmlSerializer 类序列化对象(xml格式):
class Program
{
static void Main(string[] args)
{ //将对象实例加入到泛型集合中
List<Product> products = new List<Product>();
products.Add(new Product(, "可口可乐", 12.12, "test1"));
products.Add(new Product(, "百事可乐", 11.11, "test2"));
products.Add(new Product(, "非常可乐", 10.11, "test3")); // XML 序列化 XmlSerializer xmlSerializer = new XmlSerializer(typeof(Product)); //创建 XmlSeializer类
FileStream saveFile2 = new FileStream("Product110.xml", FileMode.Create, FileAccess.Write); for (int i = ; i < products.Count; i++) //因为集合中有多个对象,所以要分别序列化
{
xmlSerializer.Serialize(saveFile2, products[i]);
}
saveFile2.Close();
}
}
..\bin\Debug 文件夹查看 Product110.xml 文件内容得到:
C#中的 序列化和反序列化的更多相关文章
- Net中JSON序列化和反序列化处理(日期时间特殊处理)
0 缘由 笔者最近在web api端使用Json.Net进行序列化处理,而在调用端使用DataContractSerializer进行反序列化,遇到日期时间处理反序列化不成功[备注:笔者使用Net ...
- day5-python中的序列化与反序列化-json&pickle
一.概述 玩过稍微大型一点的游戏的朋友都知道,很多游戏的存档功能使得我们可以方便地迅速进入上一次退出的状态(包括装备.等级.经验值等在内的一切运行时数据),那么在程序开发中也存在这样的需求:比较简单的 ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
- 浅谈C#中的序列化与反序列化
今天我利用这篇文章给大家讲解一下C#中的序列化与反序列化.这两个概念我们再开发中经常用到,但是我们绝大部分只用到了其中的一部分,剩下的部分很多开发人员并不清楚,甚至可以说是不知道.因此我希望通过这篇文 ...
- javaIO中的序列化和反序列化
javaIO中的序列化和反序列化 1.什么是序列化?它是来解决什么问题的 1.我们创建的对象,一般情况下在内存中,程序关闭,或者因为没有地址指向而导致垃圾回收 2.这样,我们的对象就会丢失 3.那么我 ...
- C#中JSON序列化和反序列化
有一段时间没有到博客园写技术博客了,不过每天逛逛博客园中大牛的博客还是有的,学无止境…… 最近在写些调用他人接口的程序,用到了大量的JSON.XML序列化和反序列化,今天就来总结下json的序列化和反 ...
- C#中的序列化与反序列化
眼看XX鸟的课程关于C#的知识点就要学完了,翻看网络中流传的教程还是发现了一个课程中没有讲到的知识点:序列化与反序列化 无奈还是了解一下并操作一番,以备后用吧 介绍:就是将对象信息转化为二进制信息以便 ...
- K:java中的序列化与反序列化
Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...
- Java中的序列化与反序列化
序列化定义 将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化. 将一个对象保存到永久存储设备上称为持久化. 一个对象要想能够实现序列化,必须实现java.io.Serializ ...
随机推荐
- iOS-打包成ipa
第一步:模拟器选择栏,选择"Generic iOS Device ".早期版本需要断开手机连接,才可以找到. 第二步:选择"Product"菜单下的" ...
- Python修饰器的函数式编程
Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都 ...
- Python3.x List方法集合
Python中的一个内置的基础类型叫List,类比于OC中的Array..他是有序的,那么下面写一些基础的方法,以备需要时候查阅: 1>获取List的长度 len(List) 2> 索引访 ...
- angularJS项目-ajax事件的按钮loading和页面loading状态 & Controller之间通信-待续
1).按钮loading --TODO 2). page loading状态 1.在module中注入指令 // Route State Load Spinner(used on page or co ...
- Linux内核内存管理
<Linux内核设计与实现>读书笔记(十二)- 内存管理 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己来解决(用户空间的内存错误可以抛给内核来解决). 所有内核 ...
- [DHCP服务]——DHCP详解
DHCP:(Dynamic Host Configuration Protocol) 动态主机配置协议 1. DHCP是一个局域网的网络协议,采用UDP协议工作 2. DHCP作用 (1)主要应用在大 ...
- 安装Windows7出现:”安装程序无法创建新的系统分区 也无法定位系统分区“ 终极解决方案
参考:地址 解决方法: 1.先格式化一下你要装的那个盘,然后,拔出U盘,啥也别动,只拔出U盘就行,再装上U盘,然后刷新一下[选硬盘那里的高级选项中有格式化和刷新],再选择要安装的硬盘点下一步,OK了, ...
- HDU 5293 Tree chain problem 树形dp+dfs序+树状数组+LCA
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 题意: 给你一些链,每条链都有自己的价值,求不相交不重合的链能够组成的最大价值. 题解: 树形 ...
- 【BZOJ】【1028】【JSOI2007】麻将
暴力/模拟 $n\leq400$,嗯……这是一个很小的数据范围= = 判断一副牌是不是听牌并求出听什么牌太麻烦了,干脆我们直接判是不是胡牌好了~ 枚举胡的是哪张牌,然后判一下加上这张牌后是否能胡. 算 ...
- 事务并发处理: DB+ORM+逻辑代码
在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...