使用Kryo序列化具有非可序列化属性的类

时间:2015-09-29 20:36:47

标签: serialization deserialization kryo java-custom-serialization

我正在使用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();         //填充A的属性         Kryo kryo =新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。

kryo可以帮忙吗?如果是,那么正确的方法是什么?

1 个答案:

答案 0 :(得分:0)

这意味着当kryo序列化你的类及其所有成员类(B,C,...)时,某些东西在另一个线程的整个层次结构中得到了修改。例如,假设B类包含List列表。当你序列化你的A类时,这个列表中的某些内容会发生变化。那么你将获得以上异常。这就是kryo的设计方式。