java - 使用函数的结果作为新函数的参数,但为什么会出现异常?

标签 java kryo

我编写了一个精简版 RPC 框架并使用 kryo 序列化对象。 但是当我这样写时发生了异常

RpcResponse rpcResponse = new RpcResponse(input.readInt(), kryo.readClassAndObject(input), input.readBoolean());

所以我使用另一种方式来初始化我的 RpcResponse 对象。

int id = input.readInt();
boolean isInvokeSuccess = input.readBoolean();
Object resultOrThrowable = kryo.readClassAndObject(input);

RpcResponse rpcResponse = new RpcResponse(id, resultOrThrowable, isInvokeSuccess);

并且它有效。

所以我的问题是:我使用的这两种方式有什么区别吗?

异常(exception)是

io.netty.handler.codec.DecoderException: com.esotericsoftware.kryo.KryoException: Unable to find class: abc123123
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1434)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:965)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:647)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:582)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:499)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:461)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:884)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.esotericsoftware.kryo.KryoException: Unable to find class: abc123123
at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:156)
at com.esotericsoftware.kryo.util.DefaultClassResolver.readClass(DefaultClassResolver.java:133)
at com.esotericsoftware.kryo.Kryo.readClass(Kryo.java:670)
at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:781)
at org.develcarl.rpc.serializer.RpcResponseSerializer.read(RpcResponseSerializer.java:30)
at org.develcarl.rpc.serializer.RpcResponseSerializer.read(RpcResponseSerializer.java:14)
at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:790)
at org.develcarl.rpc.serializer.KryoSerializer.deserialize(KryoSerializer.java:56)
at org.develcarl.rpc.netty.NettyKryoDecoder.decode(NettyKryoDecoder.java:28)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:343)
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428)
... 16 more
Caused by: java.lang.ClassNotFoundException: abc123123
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at com.esotericsoftware.kryo.util.DefaultClassResolver.readName(DefaultClassResolver.java:154)
... 27 more

最佳答案

是的。第二个有效。操作的顺序很重要,有intbooleanObject。在第一个示例中,您读取了 intObjectboolean。你可以这样做,

int id = input.readInt();
boolean isInvokeSuccess = input.readBoolean();
RpcResponse rpcResponse = new RpcResponse(id, 
        kryo.readClassAndObject(input), isInvokeSuccess);

无论如何,您都必须按照字段的写入顺序读取字段。

关于java - 使用函数的结果作为新函数的参数,但为什么会出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50938966/

相关文章:

java - 字段 'user_id' 没有默认值,但设置为 auto_increment

java - LAMP中 'P'有什么意义?为什么是 PHP、Perl 或 Python?

apache-spark - 为什么kryo注册在SparkSession中不起作用?

apache-spark - 从 Spark RDD 读取 Kryo 文件

java - 如何使用 kryoSerialzation 将非序列化对象存储到重新缓存中

java - Android Studio Java 类似乎没有链接到布局文件

java - 哪些工具可用于将测试数据填充到 mongodb

java - 无法从外部连接到 Jetty 中嵌入的 ActiveMQ 代理

java - Kryo 中的自动类(class)注册

java - Kryo 序列化/反序列化