小编ecn*_*niv的帖子

使用HashMap进行奇怪的序列化行为

考虑以下三个类:

  • EntityTransformer包含将实体与String 相关联的映射
  • 实体是一个包含ID的对象(由equals/hashcode使用),它包含对EntityTransformer的引用(注意循环依赖)
  • SomeWrapper包含一个EntityTransformer,并维护一个Map关联实体的标识符和相应的Entity对象.

以下代码将创建一个EntityTransformer和一个Wrapper,将两个实体添加到Wrapper,对其进行序列化,对其进行反序列化并测试两个权限的存在:

public static void main(String[] args)
    throws Exception {

    EntityTransformer et = new EntityTransformer();
    Wrapper wr = new Wrapper(et);

    Entity a1 = wr.addEntity("a1");  // a1 and a2 are created internally by the Wrapper
    Entity a2 = wr.addEntity("a2");

    byte[] bs = object2Bytes(wr);
    wr = (SomeWrapper) bytes2Object(bs);

    System.out.println(wr.et.map);
    System.out.println(wr.et.map.containsKey(a1));
    System.out.println(wr.et.map.containsKey(a2));
}
Run Code Online (Sandbox Code Playgroud)

输出是:

{a1 = whatever-a1,a2 = whatever-a2}

真正

所以基本上,序列化以某种方式失败,因为映射应该包含两个实体作为键.我怀疑Entity和EntityTransformer之间存在循环依赖关系,事实上如果我将Entity的EntityManager实例变量设为静态,它就可以工作.

问题1:鉴于我坚持这种循环依赖,我怎么能克服这个问题?

另一个非常奇怪的事情:如果我删除地图维护包装器中的标识符和实体之间的关联,一切正常......?

问题2 …

java serialization deserialization

5
推荐指数
1
解决办法
828
查看次数

标签 统计

deserialization ×1

java ×1

serialization ×1