1

虽然有一个名为的接口ISerializable,但它似乎是为了在一个类型被标记为[Serializable]属性时自定义细节。如果我理解正确,[Serializable]属性本身不会触及它所附加的类型上的任何东西,但是在运行时实现的东西会IFormatter确定给定对象是否被标记为[Serializble]属性(通过反射?我猜)。方法也IFormatter.Serializble()需要 any Object。这是否意味着 .NET 中的几乎每个对象都可以序列化?如果没有,如果传递了不可序列化的对象,有没有办法只采用可序列化的对象并产生编译时错误?

4

1 回答 1

5

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

补充说明:

  • [Serializable]是一个伪属性 - 它实际上映射到一个 IL 标志,而不是常规属性注释,此外它仅由一些序列化程序使用(非常不是全部)
  • 使用ISerializable/ IFormatterAPI 的序列化程序通常是您要用于大多数通用场景的最后一个序列化程序 - 它们通常比其他更宽容的序列化程序(json、xml、protobuf 等)更脆弱和类型绑定

这是否意味着 .NET 中的几乎每个对象都可以序列化?

不。但是,不同的序列化程序对于何时可以序列化事物有不同的规则,并且这些规则通常是多种多样的......即它可以看起来像 X像 Y像 Z。因此,唯一接受所有 3 个的 API是:object

于 2018-12-21T09:35:20.450 回答