Использование Kryo для сериализации классов с непериализуемыми атрибутами

Я использую Kryo Serializer для сериализации моего Java-объекта

Мой Java-объект такой

Class A {

private Class B;
private Class C;
private Class D;
int x ;
int y;
}

B, C и D являются сторонними библиотеками и не сериализуются. Также я не могу редактировать их код.

Я использую Kryo для сериализации A a = new A (); // заполнить свойства A Kryo kryo = new Kryo(); Выходные данные = новые выходные данные (новый FileOutputStream("file.bin")); kryo.writeClassAndObject(output, A); output.close();

и десериализовать

    input = new com.esotericsoftware.kryo.io.Input(new FileInputStream("file.bin"));
        InputQueueManagerImpl inputQueue = (A) kryo.readClassAndObject(input);//, A.class);
        input.close();

При выполнении я получаю ConcurrentModificationException

    at apache.Application.main(Application.java:43)
Caused by: com.esotericsoftware.kryo.KryoException: java.util.ConcurrentModificationException
Serialization trace:
classes (sun.misc.Launcher$AppClassLoader)
contextClassLoader (java.lang.Thread)
threads (java.lang.ThreadGroup)
parent (java.lang.ThreadGroup)
group (java.util.concurrent.Executors$DefaultThreadFactory)
threadFactory (java.util.concurrent.ThreadPoolExecutor)
executor (com.rabbitmq.client.impl.ConsumerWorkService)
workService (com.rabbitmq.client.impl.ConsumerDispatcher)
dispatcher (com.rabbitmq.client.impl.ChannelN)
_channelMap (com.rabbitmq.client.impl.ChannelManager)
_channelManager (com.rabbitmq.client.impl.AMQConnection)
delegate (org.springframework.amqp.rabbit.connection.SimpleConnection)
target     (org.springframework.amqp.rabbit.connection.CachingConnectionFactory$ChannelCachingConnectionProxy)
checkoutPermits (org.springframework.amqp.rabbit.connection.CachingConnectionFactory)
connectionFactory (org.springframework.amqp.rabbit.core.RabbitAdmin)
amqpAdmin (mqclient.rabbitmq.manager.impl.InputQueueManagerImpl)
at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585)
at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)

Когда я делаю B,C,D переходным процессом, он работает правильно. Но я хочу сериализировать B,C,D тоже.

Может ли здесь помочь крио? Если да, то как правильно это сделать?

1 ответ

Это означает, что в то время как kryo сериализует ваш класс и весь его класс-член (B, C, ...), что-то изменилось во всей иерархии из другого потока. Например, допустим, что класс B содержит список List. И что-то меняется в этом списке, пока вы сериализуете свой класс A ->, тогда вы получите исключение выше. Вот как устроен крио.

Другие вопросы по тегам