如何制作仅采用可序列化对象的方法?

时间:2018-12-21 09:29:12

标签: .net serializable type-safety iserializable

尽管有一个名为ISerializable的接口,但当标记为[Serializable] attribute时似乎目的在于自定义详细信息。如果我理解正确,[Serializable]属性本身不会触及它所附加的类型,但是在运行时,实现IFormatter的事物会确定给定对象是否标记为[Serializble]属性(通过反射?我猜)。 IFormatter.Serializble()方法也只接受任何Object。这是否意味着.NET中几乎每个对象都可以序列化?如果不是,是否有办法只采用可序列化的对象,如果传递了不可序列化的对象,则会产生编译时错误?

1 个答案:

答案 0 :(得分:5)

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

其他说明:

  • [Serializable]是伪属性-实际上它映射到IL标志,而不是常规属性注释,此外,它仅由某些序列化程序使用(很多不是全部)
  • 使用ISerializable / IFormatter API的
  • 序列化程序通常是您要在大多数通用场景中使用的 last 序列化程序-它们通常更易碎且类型绑定其他更宽容的序列化程序(json,xml,protobuf等)
  

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

不。但是,对于何时可以序列化 的序列化程序,不同的序列化器具有不同的规则,并且这些规则通常是多种多样的……也就是说,它看起来像X ,就像Y ,例如Z。因此,唯一接受全部3个元素的API是:object