【问题标题】:Untrusted deserialization strategy不受信任的反序列化策略
【发布时间】:2011-05-20 18:03:21
【问题描述】:

我有一个非常复杂的对象网络,我想在不受信任的环境(网络浏览器,使用 Unity 3D)中序列化和反序列化。普通的BinaryFormatter 序列化工作正常,但反序列化因“访问私有字段”错误而崩溃。当我在本地运行时,它可以完美运行。

我宁愿不公开我的所有私有字段来让我的代码库变得糟糕。在不这样做的情况下,让反序列化在不受信任的环境中工作的最佳方法是什么?我愿意改变序列化方法,BinaryFormatter 是最容易上手的。

更新我不想阻止序列化访问我的私人数据,我想允许序列化访问我的私人数据,而不必将其公开,从而妥协我的代码的封装。

谢谢。

【问题讨论】:

  • 这是一个 asp.net 应用程序吗?
  • @Saurabh,没有。这是 unity3d,一个运行 .NET 的浏览器插件。

标签: c# .net serialization mono


【解决方案1】:

XmlSerializerJavaScriptSerializer 这样的序列化程序对公共成员不利,因此它们应该(交叉手指)在信任方面可以接受。如果你想要二进制文件,你也可以尝试 protobuf-net - 但我没有积极测试过这个场景(不过,它适用于像 Silverlight 这样的东西,它有一个相当挑剔的信任模型)。

如果您想坚持使用BinaryFormatter,但又不希望它直接触及您的字段,您可以实现ISerializable,但是手动完成这一切......很痛苦。

【讨论】:

    【解决方案2】:

    没有一个答案真正回答了我的问题(请参阅更新以获得澄清)。我最终使用BinaryWriter 编写了自己的简单序列化格式。最后我意识到我所做的相当于为我的类手动实现ISerializable 接口。我必须手动实现图形序列化代码。虽然不难,但有点微妙,而且已经为我完成了。对于以后有这个问题的人,如果没有更好的答案,我建议手动实现ISerialzable

    【讨论】:

      【解决方案3】:

      好吧,如果您想通过序列化来防止私有字段访问,您可能希望转到 Xml 序列化,甚至可能是 Json 序列化。

      您可以通过在私有字段上放置 NonSerializaed 属性来防止它们被序列化,但是当开发人员希望他们的字段包含有效值并且没有考虑到这些字段值在传输到时会丢失的事实时,您可能会遇到问题Unity 插件。

      【讨论】:

      • (添加[NonSerialized])这当然意味着它并没有真正序列化任何东西——除非我误解了你
      • 不,你没有误会。就像我提到的那样,NonSerialized 字段中的值会丢失,并且在使用低级命令模式之类的情况下需要认真注意,或者在更可能的情况下,切换到 Json 或 Xml 序列化。
      猜你喜欢
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 2018-10-20
      • 2019-04-20
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      相关资源
      最近更新 更多