C# 把类实例保存到文件里(类的序列化和反序列化)

目录

有时候我们希望把类的实例保存下来,以便以后使用。一个直观的方法就是使用 StreamWriter 把类写成一行,用制表符分隔开每个属性,然后用 StreamReader 读出来。

但是这样太麻烦,代码行数较多,而且必须事先知道属性在行中的对应位置。这时候如果采用类序列化的方式保存就使得代码很简单:

基本序列化方法

1. 标记可序列化类

假如你有一个类,在它的上面加上 [Serializable] 属性就可以了,表示这个类是可以序列化的:

[Serializable]
public class People
{
    public string Name { get; set; }
    public int Age { get; set; }
}

2. 序列化到文件

然后采用如下代码将类的实例序列化到文件中:

// 序列化
FileStream fs = new FileStream(@"D:\Program\CSharp\NGramTest\NGramTest\serializePeople.dat", FileMode.Create);
People p = new People() { Name = "Haocheng Wu", Age = 24 };

BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, p);
fs.Close();

3. 从文件反序列化

这样就能够将类的实例保存到文件中,如果想要读出来,就可以用:

// 反序列化
fs = new FileStream(@"D:\Program\CSharp\NGramTest\NGramTest\serializePeople.dat", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
People p = bf.Deserialize(fs) as People;

序列化集合对象

序列化 List 集合

运用同样的方法,也可以把一个类的 List 完全序列化到文件中:

// 序列化 List
FileStream fs = new FileStream(@"D:\Program\CSharp\NGramTest\NGramTest\serializePeople.dat", FileMode.Create);
BinaryFormatter bf = new BinaryFormatter();

List<People> ps = new List<People>();
ps.Add(new People() { Name = "Haocheng Wu", Age = 24 });
ps.Add(new People() { Name = "James Wu", Age = 23 });

bf.Serialize(fs, ps);
fs.Close();

反序列化 List 集合

读出来的方法也是一样的:

// 反序列化 List
fs = new FileStream(@"D:\Program\CSharp\NGramTest\NGramTest\serializePeople.dat", FileMode.Open);
BinaryFormatter bf = new BinaryFormatter();
List<People> ps = bf.Deserialize(fs) as List<People>;

注意事项

  • 序列化可以保存对象的完整状态,包括私有字段
  • 被序列化的类必须标记 [Serializable] 特性
  • 使用 BinaryFormatter 可以实现二进制序列化
  • 反序列化时需要类型转换(使用 as 关键字进行安全转换)

应用场景

序列化可以做很多事情,这里仅仅举了两个简单的例子,很容易可以举一反三:

  • 数据持久化:保存应用程序状态、用户配置等
  • 网络传输:在客户端和服务器之间传输对象
  • 缓存存储:将复杂对象序列化后存入缓存
  • 深拷贝:通过序列化和反序列化实现对象的深拷贝

通过使用序列化技术,可以大大简化对象存储和传输的代码,提高开发效率。

💬 评论