You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者张志炜

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:52:35