您的位置:首页 > 其它

序列化与反序列化

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();
}
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: