代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

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

  •  2
  • Joan Venge  · 技术社区  · 15 年前

    我使用的是XML序列化程序,但当我切换到二进制序列化时,它引发了一个异常:

    运行时错误:dotnet运行时异常:程序集“mytypes,version=1.0.0.0,culture=neutral,publicKeyToken=null”中的类型“mytypes.myObject”未标记为可序列化。

    为什么它与XML序列化程序的请求方式不同?

    仅仅将对象标记为可序列化就足以解决这个问题了?我不想指定如何进行序列化。

    2 回复  |  直到 8 年前
        1
  •  9
  •   Greg Beech    15 年前

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

    任何运行时格式化程序(包括 BinaryFormatter )序列化公开和私人可访问的信息,这样可以让呼叫者访问他们本来不应该拥有的信息。将您的类型标记为 [Serializable] 实际上,您是在说您已经考虑过这个问题,并且允许任何人查看关于您的类型的序列化信息。

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

        2
  •  2
  •   Darin Dimitrov    15 年前

    两者之间的根本区别 BinaryFormatter XML序列化程序(明显的输出格式除外)是二进制序列化保留类型信息(私有/公共属性、方法、事件等)。这就是这种类型的序列化用于远程处理的原因之一。唯一的要求是用 SerializableAttribute .