棘手的对象序列化

时间:2013-04-02 02:41:35

标签: java

什么是最安全的方法来序列化任何类型的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)返回新的say ID_KEY实例,但仍然具有“序列化”版本。

2 个答案:

答案 0 :(得分:0)

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

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

JSON同样糟糕,即使不是更糟。 JSON对象的属性顺序是显式未定义的,因此您无法保证属性每次都以相同的顺序出现在序列化中。

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


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

答案 1 :(得分:0)

您无法执行此操作,因为java.lang.Object不可序列化。

使用java.io.Serializable标记类,以指示程序员已允许二进制表示能够重新生成。

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

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