Сериализация и десериализация HashMap <MyObject, список <Integer>с Джексоном - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я работаю над небольшим приложением для Android, которое должно иметь возможность сохранять / восстанавливать ряд настроек через сериализацию / десериализацию с использованием библиотеки Джексона. Для большинства частей это работает очень хорошо, и я могу сериализовать свои объекты и восстановить их снова. Теперь мне нужно сериализовать / десериализовать приватный член с типом:

HashMap<Model, List<Integer>>

Модель - один из моих собственных объектов, содержащий набор простых значений + методы получения / установки. И вот тут я сталкиваюсь с проблемами. Он начинает выдавать мне следующую ошибку:

DataAccess: Cannot find a (Map) Key deserializer for type [simple type, class com.schulz.toolie.Models.Model] at [Source: (String)"{"; line: 1, column: 1]

Я попытался установить аннотации, такие как @JsonAnyGetter и @JsonAnySetter, в методах получения / установки, а также @JsonProperty («подписка») для получения, установки и переменной.

Есть ли способ обойти это? желательно без написания пользовательских методов сериализации / десериализации, так как я получу довольно много из них.

1 Ответ

0 голосов
/ 17 января 2019

Ваша проблема в том, что у Джексона есть стандарт для преобразования Карты в JSON.Ключи карты используются в качестве имен свойств в результатах JSON.

Map<String, Double> groceryPrices = new HashMap<>();
groceryPrices.put("apple", 0.25);
groceryPrices.put("orange", 0.30);

Это, естественно, переводится в объект JSON:

{
  "apple": 0.25,
  "orange": 0.30
}

Проблема в том, что вы используете сложный объект для представления ключа.Не существует простого метода для сериализации и десериализации вашего сложного объекта в / из строки.

Если вы не хотите писать собственную сериализацию, я предлагаю вам изменить структуру данных.Ваша текущая структура связывает модель с целыми числами.Вы можете сложить список целых чисел в сам объект Model:

Map<String, Model> models; // This could map modelId -> Model which now contains the integers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...