Hazelcast: глобальный сериализатор и обобщение байтового массива Jackson-Smile - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь зарегистрировать глобальный сериализатор, используя jackson-smile для hazelcast.

public class GlobalJacksonSmileSerializer implements ByteArraySerializer<Object> {
    private final ObjectMapper mapper = new ObjectMapper(new SmileFactory());
    public int getTypeId() { return 1; }

    public void destroy() { }

    @Override
    public byte[] write(final Object object) throws IOException {
        return mapper.writeValueAsBytes(object);
    }

    @Override
    public Object read(final byte[] bytes) throws IOException {
        return mapper.readValue(bytes, Object.class);
    }
}

При десериализации объекта, содержащего универсальную коллекцию, например,

public class Foo {
    private List<Bar> bars;
}

, происходит сбой:

Caused by: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to Bar

В соответствии с другими ответами здесь на стеке потока (например, java.lang.ClassCastException: java.util.LinkedHashMap не может быть приведен к com.testing.models.Account ) этоограничение Джексона.

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

1 Ответ

0 голосов
/ 20 ноября 2018

Пожалуйста, проверьте это как пример: https://github.com/gokhanoner/generic-serializer/blob/master/member/src/main/java/test/BBSerializer.java

Используйте StremSerializer & напишите имя класса перед сериализацией объекта.Затем при десериализации получите имя класса и передайте его в метод objectnapper.readValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...