Apache Ignite не сериализует / десериализует Guavas LoadingCache - PullRequest
0 голосов
/ 14 февраля 2020

Я использую Java7 и настраиваю Apache Ignite (версия 2.7.5), где работают серверы / клиенты. Однако клиенты не могут извлечь переменную Guavas LoadingCache из объекта (однако ConcurrentHashMap извлекается без проблем). Кажется, что как-то при вызовах прокси Ignites объект не сериализуется / десериализован правильно, и у меня возникают проблемы, так как документы Guavas говорят, что LoadingCache / Cache реализует Serializable.

В следующем примере класс MyContainer и _foo1 в порядке и были правильно сериализованы и десериализованы, но _foo (LoadingCache) не было.

public class MyContainer {

private final ConcurrentHashMap<Object, Object> _foo1 = new ConcurrentHashMap<>();

private final LoadingCache<Object, Test> _foo = CacheBuilder.newBuilder().weakValues()
               .build(new CacheLoader<Object, Test>() {
                @Override public Test load(Object key) throws Exception {
                     return new Test(key);
                }});


}

Пожалуйста, дайте мне знать, если вам нужно больше деталей, и любая помощь очень ценится. С наилучшими пожеланиями, Гелдер

ОБНОВЛЕНИЕ

Привет всем, с ответом Дениса я больше копался и нашел некоторые упоминания о cfg.setMarshaller(new OptimizedMarshaller().setRequireSerializable(false));, и это сработало. Тем не менее, setMarshaller устарела, и я не уверен насчет этого подхода в основном на уровне производительности.

Любое прочтение / объяснение того, что было значительным за отказ от этого метода?

С наилучшими пожеланиями, Гелдер

1 Ответ

3 голосов
/ 14 февраля 2020

CacheBuilder создает экземпляр LocalCache.LocalLoadingCache. У него есть метод writeReplace, который портит сериализацию.

Эта проблема была исправлена ​​в Ignite 2.3: https://issues.apache.org/jira/browse/IGNITE-6485

Какую версию Ignite вы используете? Я бы порекомендовал обновить версию Ignite до fre sh и перейти на Java 8 или 11, поскольку Java 7 больше не поддерживается Ignite.

...