Java 如何反序列化synchronizedMap和synchronizedList?
这可能只是一个语法问题(我无法找到它;) 以下是要(反)序列化的集合:Java 如何反序列化synchronizedMap和synchronizedList?,java,serialization,syntax,Java,Serialization,Syntax,这可能只是一个语法问题(我无法找到它;) 以下是要(反)序列化的集合: private Map<String, Terminal> terminals = Collections.synchronizedMap(new HashMap<String, Terminal>()); private List<Host> hosts = Collections.synchronizedList(new ArrayList<Host>()); 现在反序列
private Map<String, Terminal> terminals = Collections.synchronizedMap(new HashMap<String, Terminal>());
private List<Host> hosts = Collections.synchronizedList(new ArrayList<Host>());
现在反序列化,这会抛出一个ClassCastException(显然):
.readObject()中的终端=(HashMap);
hosts=(ArrayList)在.readObject()中;
但以下内容无法编译(以及我尝试过的许多其他变体):
terminals=(Collections.synchronizedMap(newhashMap()))在.readObject()中;
hosts=.readObject()中的Collections.synchronizedList(new ArrayList());
这个怎么样
terminals = (Map<String, Terminal>) in.readObject();
hosts = (List<Hosts>) in.readObject();
.readObject()中的终端=(映射);
hosts=(列表)位于.readObject()中;
由集合包装的映射
或列表
。synchronizedMap
/集合。synchronizedList
应该可以反序列化,而无需重新包装。这是怎么回事
terminals = (Map<String, Terminal>) in.readObject();
hosts = (List<Hosts>) in.readObject();
.readObject()中的终端=(映射);
hosts=(列表)位于.readObject()中;
由集合包装的映射
或列表
。synchronizedMap
/集合。synchronizedList
应被反序列化,无需重新包装。此语法应“起作用”,但带有有效警告:
terminals = (Map<String, Terminal>) in.readObject();
.readObject()中的终端=(映射);
为了消除警告并确保100%的类型安全,您需要迭代映射的内容,并检查它们的类型:
Map<?, ?> tmp = (Map<?, ?>) in.readObject();
Map<String, Terminal> copy = new HashMap<String, Terminal>();
for (Map.Entry<?, ?> e : tmp.entrySet())
copy.put((String) e.getKey(), (Terminal) e.getValue());
terminals = Collections.synchronizedMap(copy);
.readObject()中的映射tmp=(Map);
Map copy=newhashmap();
对于(Map.Entry e:tmp.entrySet())
copy.put((String)e.getKey(),(Terminal)e.getValue());
终端=集合。同步地图(副本);
此语法应“有效”,但带有有效警告:
terminals = (Map<String, Terminal>) in.readObject();
.readObject()中的终端=(映射);
为了消除警告并确保100%的类型安全,您需要迭代映射的内容,并检查它们的类型:
Map<?, ?> tmp = (Map<?, ?>) in.readObject();
Map<String, Terminal> copy = new HashMap<String, Terminal>();
for (Map.Entry<?, ?> e : tmp.entrySet())
copy.put((String) e.getKey(), (Terminal) e.getValue());
terminals = Collections.synchronizedMap(copy);
.readObject()中的映射tmp=(Map);
Map copy=newhashmap();
对于(Map.Entry e:tmp.entrySet())
copy.put((String)e.getKey(),(Terminal)e.getValue());
终端=集合。同步地图(副本);
哈哈,我现在觉得自己很笨吗;)但我觉得特别奇怪的是,如果我将synchronizedMap初始化更改为常规HashMap,我的案例(导致ClassCastException)运行良好。哈哈,我现在觉得自己很笨吗但我觉得特别奇怪的是,如果我将synchronizedMap初始化更改为常规HashMap,我的案例会导致ClassCastException,效果很好。你太棒了!您的附录刚刚回答了我将要发布的另一个问题!;)你真棒!您的附录刚刚回答了我将要发布的另一个问题!;)