Я пытаюсь десериализовать объект, в котором есть ConcurrentMap
, но я получаю исключение.Как десериализировать ConcurrentMap с Gson
Caused by: java.lang.IllegalArgumentException: Can not set java.util.concurrent.ConcurrentMap field com.example.Row.doubleValues to java.util.LinkedHashMap
Моя функция выглядит примерно так:
T deserialise(final InputStream input, final Class<T> type) {
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson = gsonBuilder.create();
InputStreamReader isr = new InputStreamReader(input);
return gson.fromJson(isr, type);
}
Как заставить его десериализацию карты правильно? Нужно ли мне предоставлять собственный десериализатор?
Обратите внимание, что у меня есть как обычные Maps
, так и ConcurrentMaps
в одном классе. Я также являюсь тем, кто сериализует класс, поэтому, если я могу предоставить собственный сериализатор, который задает тип параллельных карт, а затем десериализатор, который определяет, как они должны создаваться как объекты, которые должны работать.
Update: Класс, который я десериализации выглядит так:
public class Row implements Serializable {
private static final long serialVersionUID = 1L; //there's a diff value here
private final String key;
private final ConcurrentMap<String, Double> doubleValues = Maps.newConcurrentMap();
private Map<String, String> writeOnceValues = Maps.newHashMap();
...
}
могли бы вы показать соответствующую часть класса десериализации в? – Katona
@ Katona добавил пример – naumcho
одним очевидным решением является изменение типа 'doubleValues' с' ConcurrentMap' на 'Map', вам это действительно нужно? В противном случае вам понадобится индивидуальная десериализация, см. [This] (http://stackoverflow.com/questions/16127904/gson-fromjson-return-linkedhashmap-instead-of-enummap) вопрос, проблема аналогична, но не является indentical, и я думаю это решение ('InstanceCreator') может работать здесь. – Katona