java kryo_kryo序列化 - Java序列化期间的错误

我的应用程序有大量域对象,它们通过spring-session被序列化到Redis存储中。我试图使用Kryo(4.0.0)进行自动序列化,而不使对象明确可序列化。kryo序列化 - Java序列化期间的错误

我在尝试序列化尚未实现的对象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)

2017-02-04

Charith

+0

可能有更多的例外,这里没有显示..你能展示更多吗? –

+0

@theBeacon更新。 –

+0

'java.io.NotSerializableException:mypck.UserDomain'的部分内容你不明白吗? –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kryo是一个快速、高效的Java序列化框架,比Java自带的序列化框架更快、更小、更节省内存。在Spark中,使用Kryo作为默认的序列化框架可以显著地提高性能。下面是一个使用Kryo序列化的案例: ```java import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.serializer.KryoRegistrator; import com.esotericsoftware.kryo.Kryo; public class KryoExample { public static void main(String[] args) { SparkConf conf = new SparkConf().setAppName("KryoExample").setMaster("local"); conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer"); conf.set("spark.kryo.registrator", MyKryoRegistrator.class.getName()); JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> lines = sc.textFile("input.txt"); JavaRDD<MyObject> objects = lines.map(line -> { MyObject obj = new MyObject(); obj.setId(Integer.parseInt(line.split(",")[0])); obj.setName(line.split(",")[1]); return obj; }); objects.foreach(obj -> System.out.println(obj.getId() + ": " + obj.getName())); } public static class MyObject { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class MyKryoRegistrator implements KryoRegistrator { @Override public void registerClasses(Kryo kryo) { kryo.register(MyObject.class); } } } ``` 在上面的代码中,我们首先创建了一个SparkConf对象,并设置了应用名称和运行模式。然后,我们设置了序列化器为KryoSerializer,并指定了KryoRegistrator为MyKryoRegistrator。MyKryoRegistrator类是一个自定义的Kryo注册器,用于注册我们需要序列化的类MyObject。 接下来,我们使用JavaSparkContext读取了一个文本文件,并将每一行转换成一个MyObject对象。最后,我们对这些对象进行了遍历,并输出了它们的id和name属性。 需要注意的是,如果我们没有使用KryoSerializer序列化器,程序将默认使用Java自带的序列化器,这样可能会导致性能瓶颈。因此,建议在Spark中使用Kryo作为默认的序列化器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值