.NET中Serializable 特性有何作用
2025-05-06 17:09
.NET
0
0
0
0
标题录入
封面图
在 .NET 中,`[Serializable]` 是一个特性(attribute),用于标记类或结构体为可序列化的。这意味着该类的实例可以被转换为字节流(通常是二进制格式),以便存储到文件、数据库或者通过网络传输。同样,它也可以从字节流恢复为对象。 ### 主要作用 1. **序列化与反序列化** 使用 `[Serializable]` 标记的类可以通过 .NET 提供的序列化机制进行序列化和反序列化操作。序列化是将对象的状态保存到某种介质(如文件、内存或网络)的过程,而反序列化则是从介质中读取数据并还原成对象的过程。 - **序列化示例**: ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { Person person = new Person { Name = "Alice", Age = 30 }; // 序列化对象到文件 BinaryFormatter formatter = new BinaryFormatter(); using (FileStream fileStream = new FileStream("person.dat", FileMode.Create)) { formatter.Serialize(fileStream, person); } Console.WriteLine("对象已序列化到文件"); } } ``` - **反序列化示例**: ```csharp using System; using System.IO; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } } class Program { static void Main() { // 反序列化对象从文件 BinaryFormatter formatter = new BinaryFormatter(); using (FileStream fileStream = new FileStream("person.dat", FileMode.Open)) { Person person = (Person)formatter.Deserialize(fileStream); Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); } } } ``` 2. **支持多种序列化方式** .NET 提供了多种序列化方式,包括但不限于: - **BinaryFormatter**:二进制格式的序列化器。 - **XmlSerializer**:XML 格式的序列化器。 - **DataContractSerializer**:基于 WCF 的数据契约序列化器。 如果使用 `BinaryFormatter` 进行序列化,只需简单地加上 `[Serializable]` 特性即可。但如果是其他序列化方式(如 `XmlSerializer` 或 `DataContractSerializer`),则需要使用它们各自的属性来标记类和成员。 3. **默认支持的序列化行为** 当一个类被标记为 `[Serializable]` 后,.NET 会自动处理类的所有公共字段和私有字段的序列化。如果某些字段不需要被序列化,则可以通过 `ISerializable` 接口或 `NonSerialized` 属性来控制。 - 示例:忽略某个字段不参与序列化 ```csharp using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; [Serializable] public class Person { public string Name { get; set; } [NonSerialized] public int SecretNumber { get; set; } } class Program { static void Main() { Person person = new Person { Name = "Bob", SecretNumber = 12345 }; BinaryFormatter formatter = new BinaryFormatter(); using (FileStream fileStream = new FileStream("person.dat", FileMode.Create)) { formatter.Serialize(fileStream, person); } // 反序列化时 SecretNumber 字段将丢失 } } ``` 4. **跨应用程序域通信** 在 .NET 中,`[Serializable]` 标记的类可以在不同的应用程序域之间传递。例如,WCF(Windows Communication Foundation)服务通常会要求数据契约类实现序列化。 --- ### 注意事项 - **性能问题** `[Serializable]` 的默认实现效率较低,因为它会序列化所有字段,包括未使用的或冗余的数据。因此,在性能敏感的场景下,建议使用更高效的序列化方式,如 `Json.NET` 或自定义序列化逻辑。 - **安全性问题** 使用 `[Serializable]` 的类可能面临安全风险,因为攻击者可能会利用反序列化漏洞执行恶意代码。因此,在处理来自不可信源的序列化数据时,务必小心验证输入。 - **仅支持字段级序列化** 默认情况下,`[Serializable]` 只会序列化类的字段,而不包括属性。如果需要序列化属性,必须手动实现 `ISerializable` 接口。 - **版本兼容性** 如果类的结构发生变化(例如添加或删除字段),可能会导致序列化和反序列化失败。为了避免这种情况,可以使用 `StreamingContext` 来处理版本兼容性问题。 --- 总结来说,`[Serializable]` 是 .NET 中一种方便且强大的工具,用于实现对象的持久化和远程通信。然而,在实际开发中,应根据具体需求选择合适的序列化方式,并注意潜在的安全性和性能问题。
上一篇:
.NET中Int[]是引用类型还是值类型
下一篇:
.NET委托回调静态方法和实例方法有何区别
标题录入,一次不能超过6条
灵感和创意的闪现
T:0.006657s,M:252.06 KB
返回顶部
留言
留言
评论