C#中[Serializable]特性的作用是什么?何时必须使用它?
[Serializable]特性的作用与必须使用的场景
你测试里用System.Text.Json序列化带不带[Serializable]的类结果一致,是因为System.Text.Json这类现代序列化库根本不依赖这个特性——它们是通过反射访问类的公共属性/字段来完成序列化的,所以有没有这个标记对它们没影响。
[Serializable]是.NET从早期就存在的标记,它的核心作用和适用场景其实是针对传统的.NET序列化机制:
1. 必须用于传统二进制/Soap序列化
只有标记了[Serializable]的类,才能被BinaryFormatter、SoapFormatter这类原生传统序列化器处理。如果用这些序列化器序列化没标记的类,会直接抛出SerializationException异常。比如把你的测试代码改成用BinaryFormatter试试:
var formatter = new BinaryFormatter(); using var stream = new MemoryStream(); // 用NotSerializableModel会报错,SerializableModel则正常 formatter.Serialize(stream, new SerializableModel { Id = 1, Name = "Test" });
2. 其他强制要求的场景
- 跨AppDomain对象传递:在.NET Framework中,跨AppDomain传递对象时,底层依赖二进制序列化,所以对象类必须标记
[Serializable]。 - 遗留组件/框架依赖:比如一些旧的.NET Framework库、WCF的部分绑定场景、ASP.NET Session状态用二进制存储模式时,都要求类标记这个特性。
总结
现代序列化库(System.Text.Json、Newtonsoft.Json等)不需要[Serializable],但如果涉及.NET传统的二进制序列化、跨AppDomain传递或者某些遗留框架,就必须给类标记这个特性。
内容的提问来源于stack exchange,提问作者张志炜
相关产品推荐
相关产品推荐

