Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何反序列化synchronizedMap和synchronizedList?_Java_Serialization_Syntax - Fatal编程技术网

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,效果很好。你太棒了!您的附录刚刚回答了我将要发布的另一个问题!;)你真棒!您的附录刚刚回答了我将要发布的另一个问题!;)