【发布时间】:2017-02-04 04:43:52
【问题描述】:
我的应用程序有一堆域对象,它们通过 spring-session 序列化到 Redis 存储中。我正在尝试使用 Kryo (4.0.0) 进行自动序列化而不使对象显式可序列化。
我在尝试序列化尚未实现 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)
我的 Kryo 初始化器:
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;
}
更新 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)
【问题讨论】:
-
这里可能没有显示更多的异常.. 你能显示更多吗?
-
@theBeacon 已更新。
-
'java.io.NotSerializableException: mypck.UserDomain' 的哪一部分你不明白?
-
@EJP 当我有可序列化的对象并且它具有不实现可序列化的复合对象时,我正在努力配置 kryo。简而言之,securitycontextimpl 由 spring security 管理,它具有身份验证对象,而该对象又具有此用户域对象(它不实现可序列化)。我正在使用 kryo 对通过 spring-session 保存到 redis 会话存储的对象进行隐式序列化。
标签: serialization hazelcast spring-session kryo spring-data-redis