C#序列化与反序列化。

时间:2023-12-14 12:42:02

序列化介绍:

把对象用一种新的格式来表示。

系列化只序列化数据。

序列化不建议使用自动属性

为什么要序列化:

将一个复杂的对象转换流,方便存储与信息交换。

class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "张三";
person.Age = ;
// json 序列化 变成字符串
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
string msg = javaScriptSerializer.Serialize(person);
Console.WriteLine(msg);
}
}
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

二进制序列化:

就是将对象变成流的过程,把对象变成byte[ ]。

class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "张三";
person.Age = ;
// 二进制序列化注意点:
//1、被序列化对象类型必须标记为可序列化
//2、被序列化的所有父类也必须标记为可序列化
//3、被序列化的对象的类型中字段的类型也要标记 //二进制序列化步骤:
//1、创建序列化器
BinaryFormatter bf = new BinaryFormatter();
// 1.1 创建一个文件流。
using(FileStream fsWrite =new FileStream("person.bin", FileMode.Create))
{
//2、开始执行序列化。
bf.Serialize(fsWrite, person);
}
Console.WriteLine("序列化完毕"); }
}
[Serializable]
class Person:Animal
{
public string Name { get; set; }
public int Age { get; set; }
public Car BenChi { get; set; }
}
[Serializable]
public class Animal
{
public void Eat()
{
Console.WriteLine("eat food...");
}
}
[Serializable]
public class Car
{ }

反序列化:

 class Program
{
static void Main(string[] args)
{
//二进制反序列化注意的问题:
//1、必须获取被系列化的对象的类型所在的程序集。因为它要根据序列化文件还原该对象,而序列化文件中
//只包含数据信息,而不包含其类型的相关信息、方法相关信息等,这些信息在对象序列文件中都没有。 //步骤:
//1、创建序列化器。
BinaryFormatter bf = new BinaryFormatter();
//1.1 创建读取文件的文件流。
using(FileStream fsRead=new FileStream("person.bin", FileMode.Open))
{
//2、执行反序列化。
object obj = bf.Deserialize(fsRead);
Person person = (Person)obj;
Console.WriteLine(person.Name);
}
Console.WriteLine("ok"); }
}
[Serializable]
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}

练习:添加对象到array list中,进行序列化和反序列化。

序列化:

class Program
{
static void Main(string[] args)
{
ArrayList arrayList = new ArrayList();
arrayList.Add("张三");
arrayList.Add();
//创建序列化容器
BinaryFormatter bf = new BinaryFormatter();
//创建文件流
using(FileStream fs=new FileStream("txt.txt", FileMode.Create))
{
//执行序列化
bf.Serialize(fs, arrayList);
}
Console.WriteLine("序列化完毕"); }
}

反序列化:

class Program
{
static void Main(string[] args)
{
//创建序列化容器
BinaryFormatter bf = new BinaryFormatter();
//创建读取的文件流
using(FileStream fs=new FileStream("txt.txt", FileMode.Open))
{
//执行反序列化
object obj= bf.Deserialize(fs);
ArrayList arrayList = (ArrayList)obj;
foreach (var item in arrayList)
{
Console.WriteLine(item);
}
} }
}