C# 为什么不让类序列化?

C# 为什么不让类序列化?,c#,asp.net,serializable,C#,Asp.net,Serializable,我在viewstate中存储了一些对象,我想知道使类可序列化是否有任何缺点 使所有类都可序列化是一种不好的做法吗?将其标记为[Serializable](或ISerializable)对于任何使用BinaryFormatter的操作都是必要的,在默认配置下可能包括viewstate。至于好的与坏的做法。。。嗯,大多数类不需要序列化,即使是这样,使用BinaryFormatter也不一定是最佳选择*。具体来说,将其同时标记为[Serializable]和[DataContract]将导致异常IIR

我在viewstate中存储了一些对象,我想知道使类可序列化是否有任何缺点


使所有类都可序列化是一种不好的做法吗?

将其标记为
[Serializable]
(或
ISerializable
)对于任何使用
BinaryFormatter
的操作都是必要的,在默认配置下可能包括viewstate。至于好的与坏的做法。。。嗯,大多数类不需要序列化,即使是这样,使用
BinaryFormatter
也不一定是最佳选择*。具体来说,将其同时标记为
[Serializable]
[DataContract]
将导致异常IIRC


*=实际上,IMO
BinaryFormatter
很少是一个好的选择,但我可能有偏见。。。我故意不使用viewstate;p

将所有实际可序列化为
可序列化的类设置为
是一种很好的做法。我只需要使用常识,并为那些打算跨越流程边界的类(DTO类)设置它

因此,它适用于以下类别:

  • 它们的所有属性都是简单类型
  • 如果它们有复杂的属性,那么它们的类型本身是可序列化的

  • 首先。避免查看状态

    通常,序列化(文本)用于传输对象

    您应该避免将任何不是DTO(数据传输对象)或消息类的类标记为可序列化。我们这样做有几个原因。以序列化格式拾取类的对象可能没有非DTO类的方法信息(位于原始程序集中)。其次,类可能引用资源(DB连接、文件句柄等),但不序列化这些资源,因为反序列化不会重新建立资源连接和状态,除非明确设计用于此,但这仍然是一个坏主意

    总之:当您有上下文方法并存储数据供第三方使用时,不要序列化。(就像使用方法进行服务响应一样,这是一个坏主意)。当类包含资源引用时,不要序列化。尽可能使可序列化对象与方法保持干净。这可能需要对服务类型模式进行一些重新分解

    对DTO和消息进行序列化


    这更多的是一种设计选择。

    您应该避免在viewstate中存储任何不必存储的内容,因此二进制(非文本)序列化完全没有区别,可以完全独立于平台。问题是像BinaryFormatter这样的东西,它只是一个二进制序列化程序。(不过,我同意你的其他观点;当我有更多的选票时,我会尽量记住+1动力)我从来没有说过它不依赖于平台,只是略有不同。你必须考虑特殊情况。二进制序列化保留实例标识。(不管它有什么价值)和文本序列化可以被视为保存到Disc的内存“克隆”。您强调文本序列化与平台无关;这意味着不同。关于“实例身份”(注释),再次说明这与二进制与否没有任何关系;有些文本序列化程序保留标识(DC处于完整图形模式),有些二进制序列化程序不保留标识。我的观点是:您描述的是二进制/文本序列化之间的一些人为差异,这些差异实际上只是不同序列化程序(它们本身可以是二进制的或基于文本的)的特性。我指的是开箱即用的.Net东西。撤销了刑事判决。