Сериализация синхронизированной карты с Kryo - PullRequest
0 голосов
/ 16 мая 2018

Для личного проекта мне нужно сериализовать Collections.sychronizedMap в Java с использованием Kryo-Framework. Я связан с этой структурой, поскольку есть другие зависимости, требующие этого. Моя нынешняя попытка это выглядит так:

Serializer SERIALIZER = Serializer.using(KryoNamespace.builder()
                    .register(KryoNamespaces.BASIC)
                    .register(Collections.EMPTY_MAP.getClass())
                    .register(Class.forName("java.util.Collections$SynchronizedMap"))
                    .build());

Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());

map.put("test", "123");

byte[] encoded = SERIALIZER.encode(map);

Map<String, String> decoded = SERIALIZER.decode(encoded);

Этот подход работает для части сериализации, однако я изо всех сил пытаюсь заставить десериализацию работать. Всякий раз, когда я запускаю этот фрагмент кода, NullPointerException генерируется, когда метод put для synchronizedMap вызывается во время процесса десериализации. Причиной этого, по-видимому, является внутренняя карта, которую использует synchronizedMap, поскольку после десериализации она равна нулю. Но где моя ошибка? Можно ли как-нибудь заставить этот код работать?

1 Ответ

0 голосов
/ 16 мая 2018

Я решил проблему с помощью https://github.com/magro/kryo-serializers, библиотеки крио, которая специально предназначена для сериализации специальных типов Java.

Он может быть зарегистрирован в KryoNamespace следующим образом:

.register(new SynchronizedCollectionsSerializer(), Class.forName("java.util.Collections$SynchronizedMap"))

С тех пор это работало как шарм.

...