2

序列化任何类型的 Java 对象的最安全方法是什么,例如:

DBObject obj = getFromDB;
Object id = obj.get(ID_KEY);
String s1 = safeSerialize(id); 

obj.get(ID_KEY)方法返回一个用作“id”的对象,它可以是 ObjectId、String、Long、Integer 或任何类型的 Object。

然后做同样的事情:

DBObject obj = getFromDB;
Object id = obj.get(ID_KEY);
String s2 = safeSerialize(id); 

我需要确保s1仍然等于s2。我的意思是,例如obj.get()方法可能会返回新的实例,例如,new Integer(100)对于给定的ID_KEY,仍然具有“序列化”版本。

4

2 回答 2

0

您不能这样做,因为 java.lang.Object 不可序列化。

类用 java.io.Serializable 标记,表明程序员已经允许二进制表示能够复活。

即使您要求您存储的对象仅限于一组给定的可序列化对象,您也会受到序列化通常的脆弱性的影响。

如果您将对象集限制为您随后为其提供自定义序列化(而不是使用默认序列化)的对象集,则可以使其工作。

于 2013-04-02T04:07:44.657 回答
0

我不认为 Java 序列化给你这些保证:

  • 如果涉及的课程有任何变化,它当然不会改变。
  • 如果您在不同的 JVM 版本/发布/供应商平台上序列化/反序列化,它肯定不会。
  • 它可能不适用于具有自定义 writeObject / readObject 方法的任何类......并且包括 java.util 等中的一些基本类型。

JSON 也一样糟糕,甚至更糟。JSON 对象的属性顺序是明确未定义的,因此您无法保证属性每次都以相同的顺序出现在序列化中。

将 POJO 的基于绑定的序列化/反序列化器作为 XML 可以工作(如果它们不使用属性),但您需要注意绑定如何处理固有无序集合(如 HashSets 和 HashMaps)的序列化。序列化中的集合/映射成员的顺序可能是不可预测的。


我的建议是想出另一种方法来解决你的实际问题……不管它是什么。

于 2013-04-02T03:41:00.193 回答