C#基础:二进制序列化与反序列化实践

需积分: 32 4 下载量 92 浏览量 更新于2024-08-19 收藏 1.17MB PPT 举报
"C#基础知识全篇巩固,重点讨论序列化技术" 在C#编程中,序列化是一个将对象的状态转换为可存储或可传输的形式的过程。这是为了能够在稍后的时间点恢复这些对象,或者在不同的环境中传递它们。本文将深入探讨C#中的序列化,特别是二进制序列化。 首先,为了使一个对象能够被序列化,它的类型必须标记为`[Serializable]`。这意味着该类的对象可以被转化为字节流,以便保存或传输。同时,该类的所有父类也需要有此标记,确保整个对象层次结构可以被正确序列化。此外,类中包含的所有字段的数据类型也必须支持序列化。 二进制序列化是C#中一种常见的序列化方式,它使用`BinaryFormatter`类来实现。下面是一个使用二进制序列化的基本步骤: 1. 创建一个流对象,如`FileStream`,用于保存序列化后的数据。例如,可以使用`File.OpenWrite`创建一个写入文件的流。 2. 创建一个`BinaryFormatter`实例,这是执行序列化和反序列化的工具。 3. 使用`BinaryFormatter`的`Serialize`方法将对象写入流,完成序列化。 4. 反序列化时,同样使用`BinaryFormatter`的`Deserialize`方法从流中读取数据,恢复对象状态。 以下是一个简单的示例代码: ```csharp Person p = new Person(); p.Name = "张三"; p.Age = 18; FileStream fs = File.OpenWrite("person.bin"); using (fs) { BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, p); } ``` 在这个例子中,我们创建了一个`Person`对象并序列化到一个名为`person.bin`的文件中。之后,我们可以使用`Deserialize`方法从文件中反序列化回来。 除了二进制序列化,C#还支持XML、JSON等其他形式的序列化,它们各有优缺点,适用于不同的场景。例如,XML和JSON更便于人类阅读,更适合网络传输,而二进制序列化通常在需要节省存储空间和提高性能时使用。 在处理底层操作时,如读写文件,`BinaryReader`和`BinaryWriter`类可以帮助我们高效地读写字节流。例如,将一个图片文件的内容复制到另一个文件: ```csharp string path1 = @"D:\1.jpg"; FileStream fs1 = new FileStream(path1, FileMode.Open, FileAccess.Read, FileShare.Read); byte[] bs = br.ReadBytes((int)fs1.Length); FileStream fs2 = new FileStream(@"D:\2.jpg", FileMode.Create, FileAccess.Write, FileShare.Write); BinaryWriter bw = new BinaryWriter(fs2, Encoding.Default); bw.Write(bs); ``` C/S(客户端/服务器)和B/S(浏览器/服务器)架构是两种不同的应用模式。C/S模式通常用于内部网络,提供更高的安全性,适合处理敏感数据。而B/S模式基于互联网,方便访问,但安全控制相对较弱。这两种模式在硬件环境、安全需求和处理问题的方式上都有所不同。 理解C#的序列化机制对于开发涉及数据存储和传输的应用至关重要。无论是二进制序列化、XML序列化还是JSON序列化,都是为了让数据在不同环境间流动,从而增强程序的灵活性和可移植性。同时,对C/S和B/S架构的理解有助于选择合适的应用模型,满足项目需求。