为什么不使用BinaryFormatter序列化未标记为Serializable的类?

时间:2016-01-24 12:53:30

标签: c# serialization binary-serialization

我们都知道并在MSDN网站中提及:

  

.NET Framework提供的序列化体系结构   自动正确处理对象图和循环引用。   对象图上唯一的要求是所有对象   必须也标记被序列化的对象引用   as Serializable 。如果没有这样做,一个   当序列化程序尝试序列化时,将抛出异常   没有标记的物体。

我的问题是为什么应用这种约束? (如果这是一个约束!; - ))

2 个答案:

答案 0 :(得分:7)

BinaryFormatter具有非常不寻常的能力,没有其他类似于它的功能。它可以创建类的对象,而无需运行其构造函数。它可以为您的属性提供一个值,而无需运行属性setter访问器方法。

否则没有什么特别神奇的,它只是坚持你的类对象的字段的值。并在反序列化对象时恢复它们。

并非每个类都适合这样处理,因为安全性问题或因为字段值过于依赖于运行时状态。请注意安全性是一个问题,因为攻击者可以操纵序列化数据并使您的对象进入不一致状态,这是可利用的状态。说一个IsAdministrator属性。关键运行时状态的一个很好的例子是Control.Handle属性,它在反序列化时永远不会具有相同的值。

这些是BinaryFormatter类本身无法弄清楚的实际约束。它需要帮助,明确表示这样做是安全的。当你编写de / serialize对象的代码时,这可能不是正式的,这很容易,但实际上你不了解该类,因为你没有写它。类作者需要这样做,他通过给它[Serializable]属性来做到这一点。

答案 1 :(得分:3)

我相信https://stackoverflow.com/a/12461510/5830656的答案可以回答你为何应用此约束的问题 -

  

“防止数据意外泄漏到远程边界”

即。它存在的原因是因为它是BinaryFormatter的设计决策,它是一个安全防护,以确保程序员真正意味着BinaryFormatter序列化的数据序列化。

该MSDN文章还指出 -

  

编译后,不能使类可序列化。

(意味着尝试通过使用反射添加属性类型使其在执行时可序列化)因此,对于BinaryFormatter的实现,必须指定SerializableAttribute以编译要使用它进行序列化的类型。