我怎样才能制作一个只采用可序列化对象的方法?

Posted

技术标签:

【中文标题】我怎样才能制作一个只采用可序列化对象的方法?【英文标题】:How can I make a method to take only serializable objects? 【发布时间】:2019-05-21 18:35:40 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

补充说明:

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

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

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

【讨论】:

以上是关于我怎样才能制作一个只采用可序列化对象的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Java 可序列化对象到字节数组

基于 TCP 的 Java 可序列化安全性

我怎样才能坚持protobuf网可为空值的数组

如何从远程api序列化制作对象

我怎样才能只为一个元素制作这个?

c#中如何让自己的类也能序列化?