2010-01-14 4 views
1

Это, вероятно, только вопрос синтаксиса (и моей неспособности его найти;)Как десериализовать synchronizedMap и synchronizedList?

Вот коллекции, чтобы быть (де) сериализуется:

private Map<String, Terminal> terminals = Collections.synchronizedMap(new HashMap<String, Terminal>()); 
private List<Host> hosts = Collections.synchronizedList(new ArrayList<Host>()); 

Здесь идет сериализации:

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("blah.dmp")); 
out.writeObject(synchronizedMap); 
out.writeObject(synchronizedList); 

и теперь де-сериализуется, это исключает ClassCastException (очевидно):

terminals = (HashMap<String, Terminal>) in.readObject(); 
hosts = (ArrayList<Hosts>) in.readObject(); 

но следующий не будет компилировать (а также manyyyyy другие варианты я пробовал):

terminals = (Collections.synchronizedMap(new HashMap<String, Terminal>())) in.readObject(); 
hosts = (Collections.synchronizedList(new ArrayList<Host>())) in.readObject(); 

ответ

3

Что об этом?

terminals = (Map<String, Terminal>) in.readObject(); 
hosts = (List<Hosts>) in.readObject(); 

Map или List обернут Collections.synchronizedMap/Collections.synchronizedList должны быть десериализации просто отлично без необходимости повторно обернуть его.

+0

ха-ха мальчик теперь делать я чувствую себя немым;) Что я хотя нахожу особенно странным, если я изменить свою инициализацию synchronizedMap на регулярной HashMap, мой случай, который вызывает ClassCastException работает отлично. – glenneroo

1

Этот синтаксис должен «работать», но с действительным предупреждением:

terminals = (Map<String, Terminal>) in.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); 
+0

Ты потрясающий! Ваше добавление просто ответило на другой вопрос, который я собирался опубликовать! ;) – glenneroo

Смежные вопросы