java - Kryo throw "Encountered unregistered class ID: 44"

标签 java serialization kryo

Kyro 向我抛出以下消息:

  com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID: 44
        at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:137)
        at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:693)
        at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:804)
        at main.java.com.bag.client.TestClient.processReadReturn(TestClient.java:246)
        at main.java.com.bag.client.TestClient.replyReceived(TestClient.java:221)
        at bftsmart.communication.client.netty.NettyClientServerCommunicationSystemClientSide.channelRead0(NettyClientServerCommunicationSystemClientSide.java:244)
        at bftsmart.communication.client.netty.NettyClientServerCommunicationSystemClientSide.channelRead0(NettyClientServerCommunicationSystemClientSide.java:65)
        at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:278)
        at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:277)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:264)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:292)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:278)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:962)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:528)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:485)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:399)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:371)
        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
        at java.lang.Thread.run(Thread.java:745)

我使用以下代码片段进行序列化:

KryoPool pool = new KryoPool.Builder(factory).softReferences().build();
Kryo kryo = pool.borrow();
Input input = new Input(bytes);
ArrayList<NodeStorage> nodeStorage = new ArrayList<>();
ArrayList<RelationshipStorage> relationshipStorage = new ArrayList<>();
kryo.writeClassAndObject(output, nodeStorage);
kryo.writeClassAndObject(output, relationshipStorage);

工厂:

 private KryoFactory factory = () ->
{
    Kryo kryo = new Kryo();
    kryo.register(NodeStorage.class, 100);
    kryo.register(RelationshipStorage.class, 200);
    // configure kryo instance, customize settings
    return kryo;
};

反序列化如下:

KryoPool pool = new KryoPool.Builder(factory).softReferences().build();
Kryo kryo = pool.borrow();
ArrayList<NodeStorage>         nodeResult         = (ArrayList<NodeStorage>) kryo.readClassAndObject(input);
ArrayList<RelationshipStorage> relationshipResult = (ArrayList<RelationshipStorage>) kryo.readClassAndObject(input);

崩溃日志在执行第一次 arrayList 反序列化时出现。

NodeStorage 和关系存储包含各种 String、int 以及包含更多字符串的映射。

完整代码可以在这里找到:

https://github.com/Raycoms/thesis

最佳答案

我认为你需要一个新的序列化器。

public class ArraySerializer extends CollectionSerializer{

   protected Collection create (Kryo kryo, Input input, Class<Collection> type) {
        return new ArrayList();
   }
}

kryo.register(Arrays.asList().getClass(), new ArraySerializer());

关于java - Kryo throw "Encountered unregistered class ID: 44",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40342996/

相关文章:

serialization - 为异步消息序列化对象

python - 除了 to_pickle 之外,序列化 DataFrame 最快的方法是什么?

serialization - 如何让 Spark 使用 Kryo 序列化对象?

java - 在同一个包中创建一个单独的文件夹... [ECLIPSE]

java - CI 中的 Android 配置值

java - 为什么这个程序不给出歧义错误

java - 通过 ObjectStream 序列化问题发送/接收

java - 使用 Kryo 将多个对象序列化到一个文件中

Java 序列化、Kryo 和对象图

java - 具有多个边界的枚举和泛型 "interface expected"