序列化与反序列化
2019-06-21 12:22
369 查看
对象序列化:是将对象转换为二进制数据
反序列化:是将二进制数据还原为对象。
对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。
对象序列化,只能针对对象的字段进行序列化。
BinaryFormatter类有两个方法:
• void Serialize(Stream stream,object graph) 对象graph序列化到stream中
• object Deserialize(Stream stream) 将对象从stream中反序列化,返回值为反序列化得到的对象。
注:不是所有对象都能序列化,只有可序列化的对象才能序列化,在类的声明上加[Serializable],对象的属性、字段的类型也必须可序列化
一、序列化
json序列化
class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Name = "Alex"; p1.Age = 19; p1.Email = "Alex@163.com"; //需引用 System.web.Extensions //命名空间 using System.Web.Script.Serialization; JavaScriptSerializer jsSer = new JavaScriptSerializer(); string msg = jsSer.Serialize(p1); Console.WriteLine(msg); Console.ReadKey(); } } public class Person { public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } }
class Program { static void Main(string[] args) { Person p1 = new Person(); p1.Name = "Alex"; p1.Age = 19; p1.Email = "Alex@163.com"; p1.BenChi = new Car(); //二进制序列化注意点: //1、被序列化的对象的类型必须标记为“可序列化” -->[Serializable] //2、被序列化的类的所有弗雷必须标记为“可序列化” //3、要求被序列化的对象的类型中的所有字段的类型也必须标记为“可序列化” //二进制序列化步骤 //1、创建序列化器 BinaryFormatter bf = new BinaryFormatter(); //命名空间 using System.Runtime.Serialization.Formatters.Binary; //1.1、创建一个文件流 using (FileStream fs = new FileStream("person.bin",FileMode.Create)) { //2、开始执行序列化 bf.Serialize(fs, p1); } Console.WriteLine("ok"); Console.ReadKey(); } } [Serializable] public class Animal { public void Eat() { Console.WriteLine("吃东西。"); } } // 注意:二进制序列化,必须标记为:[Serializable] [Serializable] public class Person:Animal { public Car BenChi { get; set; } public string Name { get; set; } public int Age { get; set; } public string Email { get; set; } public void Say() { Console.WriteLine("ok1"); } } [Serializable] public class Car { }二进制补充 补充:
在字段属性前加[NonSerialized]不被序列化
[NonSerialized] private string _name; public string name { get { return _name; } set { _name = value; } }
二、反序列化
二进制反序列化:需引用序列化的dll
注:反序列化要根据序列化文件重新还原该对象,而序列化文件中只包含那些数据信息,并不包含该对象的类型相关的信息,比如:该对象是继承自那个父类,实现了哪些接口,类型中包含哪些方法。。。这些信息在对象序列化文件中都不包含,要获取这些信息必须通过该类型的程序集来获取。
class Program { static void Main(string[] args) { // 命名空间 using System.Runtime.Serialization.Formatters.Binary; // 命名空间 using System.IO; //1、创建序列化器 BinaryFormatter bf = new BinaryFormatter(); //1.1、创建读取文件的文件流 using (FileStream fs=new FileStream("person.bin", FileMode.Open)) { //2、执行反序列化 object obj = bf.Deserialize(fs); Person p1 = obj as Person; Console.WriteLine(p1.Name); Console.WriteLine(p1.Age); Console.WriteLine(p1.Email); } Console.WriteLine("ok"); Console.ReadKey(); } }
相关文章推荐
- 序列化学习
- WCF-003:关于 WCF 基础连接已经关闭 连接被意外关闭-序列化问题
- C#对象序列化与反序列化
- C#.NET解析XML(使用属性控制 XML 序列化)
- 第十三篇:泛型+序列化增强应用
- JSON的序列化和反序列化
- 黑马程序员---序列化与反序列化
- JAVA中序列化和反序列化中的静态成员问题
- C#实现序列化对象到XML文档与反序列化
- Python学习笔记——序列化操作
- 序列化
- 【文件】MFC序列化存储分析
- asp.net类序列化生成xml文件实例详解
- Unity Asset 序列化
- 如何使类具备序列化功能
- hibernate映射oracle数据库时出现“不许序列化”
- java序列化和反序列化
- SpringMVC将表单对象序列化成Json字符串提交,以List接收
- idea 设置ID自动生成序列化