为什么二进制序列化要求将对象标记为可序列化?

时间:2009-10-20 18:01:52

标签: c# .net serialization

我正在使用xml序列化程序但是当我切换到二进制序列化时,它会引发异常:

  

运行时错误:dotNet运行时异常:在程序集'MyTypes中键入'MyTypes.MyObject',Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'未标记为可序列化。

为什么它与xml序列化程序的不同之处呢?

将对象标记为可序列化就足以解决这个问题了吗?我不想指定序列化应该如何发生。

2 个答案:

答案 0 :(得分:10)

XmlSerializer在所有情况下都可以安全使用,因为它只序列化可公开访问的数据,无论如何都可以访问该类用户。

任何运行时格式化程序(包括BinaryFormatter)都会序列化公共和私人可访问的信息,因此可以让呼叫者访问他们原本不应该拥有的信息。通过将您的类型标记为[Serializable],您实际上已经考虑到了这一点,并且允许任何人查看有关您的类型的序列化信息。

这是一个“默认安全”的选择,这样您就不会意外地将敏感数据(如信用卡详细信息或其他任何内容)序列化到不应该存在的地方,例如日志或数据库。

答案 1 :(得分:2)

BinaryFormatter和xml序列化程序(明显的输出格式除外)之间的根本区别在于二进制序列化保留了类型信息(私有/公共属性,方法,事件等)。这是此类序列化与远程处理一起使用的原因之一。唯一的要求是使用SerializableAttribute装饰类型。