Reputation: 3730
My application has bunch of domain objects which get serialized into Redis store through spring-session. I'm trying to use Kryo (4.0.0) for automatic serialization without making objects explicitly serializable.
I'm getting the following error while trying to serialize objects that have not implemented Serializable
.
com.esotericsoftware.kryo.KryoException: Error during Java serialization.
com.esotericsoftware.kryo.serializers.JavaSerializer.write(JavaSerializer.java:51)
com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:651)
org.springframework.session.data.redis.KryoObjectSerializer.serialize(KryoObjectSerializer.java:51)
org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:168)
org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:129)
org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:86)
org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:778)
org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:670)
org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:388)
org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:245)
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:245)
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:217)
org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:170)
org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
JBWEB000071: root cause
java.io.NotSerializableException: mypck.UserDomain
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347)
com.esotericsoftware.kryo.serializers.JavaSerializer.write(JavaSerializer.java:48)
com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:651)
org.springframework.session.data.redis.KryoObjectSerializer.serialize(KryoObjectSerializer.java:51)
org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:168)
org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:129)
org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:86)
org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:778)
org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:670)
org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:388)
org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:245)
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:245)
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:217)
org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:170)
org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
My Kryo initializer:
private Kryo getInstance() {
Kryo kryo = new Kryo() {
@Override
public Serializer<?> getDefaultSerializer( final Class type ) {
if (AbstractPersistentCollection.class.isAssignableFrom( type )) {
return new BeanSerializer( this, type );
} else if (Serializable.class.isAssignableFrom( type )) {
return new JavaSerializer();
}
return super.getDefaultSerializer( type );
}
};
kryo.setInstantiatorStrategy(new SerializingInstantiatorStrategy());
return kryo;
}
Update 1:
com.esotericsoftware.kryo.KryoException: Error during Java serialization.
Serialization trace:
authentication (org.springframework.security.core.context.SecurityContextImpl)
com.esotericsoftware.kryo.serializers.JavaSerializer.write(JavaSerializer.java:51)
com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:575)
com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80)
com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:505)
com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:651)
org.springframework.session.data.redis.KryoObjectSerializer.serialize(KryoObjectSerializer.java:52)
org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:168)
org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:129)
org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:86)
org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:778)
org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:670)
org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:388)
org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:245)
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:245)
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:217)
org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:170)
org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
JBWEB000071: root cause
java.io.NotSerializableException: mypkg.UserDomain
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1183)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177)
java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1547)
java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1508)
Upvotes: 0
Views: 3621
Reputation: 1252
Since you are using Java serializer
(cleared from exception), your Class mypck.UserDomain
must implements serializable
or Externalizable
.
From Docs
Kryo's JavaSerializer and use the standard Java Serialization instead. This approach would be as slow as usual Java serialization, but would make your class serialize as long as Java serialization is able to serialize it. Of course, your classs should implement the Serializable or Externalizable interface as it is required by usual Java serialization.
The Reason of exception is
You might have been working on composite object
, where container class
is serializable
but alteast one of contained class
is not serializable
.
Kyro takes serializer of class whose object you passed to Kryo.writeObject(...)
API.
Also, remove
ryo.setInstantiatorStrategy(new SerializingInstantiatorStrategy());
will not work if object class whose object you passed in Kryo.readObject(...)
does not implement serializable
Better, remove this, now all serialising will be done by Kryo (unified)
public Serializer<?> getDefaultSerializer( final Class type ) {
if (AbstractPersistentCollection.class.isAssignableFrom( type )) {
return new BeanSerializer( this, type );
} else if (Serializable.class.isAssignableFrom( type )) {
return new JavaSerializer();
}
}
Upvotes: 2