尽管有一个名为 ISerializable
的接口,但在标记类型为 [Serializable]
属性时,似乎目的是自定义详细信息。如果我正确理解的话,[Serializable]
属性本身不会触摸所附加到的类型上的任何内容,而是在实现IFormatter
的运行时间内确定给定对象是否标记为[Serializble]
属性(通过反射?我猜)。另外,IFormatter.Serializble()
方法仅采用任何Object
。这实际上意味着.NET中的每个对象都可以序列化?如果没有,如果传递了不可序列化对象,是否可以仅采用可序列化对象并造成编译时错误?
否,除了编写适用您想要的确切规则的自定义Roslyn分析仪外,所有类型都无法执行此操作,并添加了您的警告。想。这是很多工作,并且简单地添加涵盖您打算支持的序列化方案的单元测试/集成测试可能会更简单。
其他注释:
-
[Serializable]
是伪属性 - 它实际上映射到IL标志,而不是常规属性注释,另外仅由某些序列化器(不是全部)使用的 - 使用
ISerializable
/IFormatter
API的连续化器通常是您要用于大多数通用场景的 last 序列化器 - 它们通常更脆,更脆弱,并且是其他更宽容的序列化器(Json,XML,Protobuf等)
这实际上意味着.NET中的每个对象都可以序列化?
否。但是,不同的序列化对可以序列化时有不同的规则,并且这些规则通常是多元化和多样化的……即,它看起来像x 或,例如y 或喜欢z。因此,接受所有3个的API是: object