我怎样才能创建一个只接受可序列化对象的方法?

How can I make a method to take only serializable objects?

尽管有一个名为 ISerializable, it seems to purpose to customize details when a type is marked [Serializable] attribute. If I understood correctly, the [Serializable] attribute by itself does not touch anything on a type it is attached to, but at run-time things implementing IFormatter determine if a given object is marked [Serializble] attribute (through reflection? I guess). Also IFormatter.Serializble() method takes just any Object 的接口。这是否意味着实际上 .NET 中的每个对象都可以序列化?如果不是,是否有办法仅获取可序列化对象并在传递不可序列化对象时产生编译时错误?

不,没有办法对所有可能可序列化的类型执行此操作,除非编写自定义 Roslyn 分析器来应用您想要的确切规则,并添加您想要的警告。这是很多工作,简单地添加涵盖您打算支持的序列化场景的单元测试/集成测试可能会更简单。

补充说明:

  • [Serializable] 是一个伪属性——它实际上映射到一个 IL 标志,而不是一个常规的属性注释,此外它只被一些序列化程序使用(不是全部)
  • 使用 ISerializable / IFormatter API 的序列化程序通常是您想要用于大多数通用目的的 last 序列化程序场景 - 它们通常比其他更宽容的序列化程序(json、xml、protobuf 等)
  • 更脆弱且受类型限制

Does it mean virtually every object in .NET can be serialized?

没有。然而,不同的序列化器对于什么时候可以可以序列化有不同的规则,并且这些规则通常是多种多样的......即它可以看起来像 X or 喜欢 Y 喜欢 Z。因此,唯一接受所有 3 的 API 是:object