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
关键字进行安全转换)
应用场景
序列化可以做很多事情,这里仅仅举了两个简单的例子,很容易可以举一反三:
- 数据持久化:保存应用程序状态、用户配置等
- 网络传输:在客户端和服务器之间传输对象
- 缓存存储:将复杂对象序列化后存入缓存
- 深拷贝:通过序列化和反序列化实现对象的深拷贝
通过使用序列化技术,可以大大简化对象存储和传输的代码,提高开发效率。
© 转载需附带本文链接,依据 CC BY-NC-SA 4.0 发布。
猜你喜欢
💬 评论