【问题标题】:Java Kryonet Error when sending object发送对象时出现Java Kryonet错误
【发布时间】:2015-10-01 00:24:27
【问题描述】:

我正在使用 Kryonet 进行对象的 TCP 发送,特别是一个名为 TransferMessage 的对象:

public static class TransferMessage{String text; String username; Color color = Color.black;}

现在,我知道我必须调用kryo.register(TransferMessage.class),但是当我尝试连接到注册了所有类的服务器时,我收到一个错误:

    Exception in thread "Server" com.esotericsoftware.kryo.KryoException: java.lang.IllegalArgumentException: Class is not registered: java.awt.Color
Note: To register this class use: kryo.register(java.awt.Color.class);
Serialization trace:
color (com.andrewlalisofficial.MessageTypes$TransferMessage)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:571)
    at com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50)
    at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192)
    at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59)
    at com.esotericsoftware.kryonet.Server.sendToAllTCP(Server.java:435)
    at com.andrewlalisofficial.ChatServer.sendMessage(ChatServer.java:204)
    at com.andrewlalisofficial.ChatServer.checkCommand(ChatServer.java:124)
    at com.andrewlalisofficial.ChatServer$1.received(ChatServer.java:72)
    at com.esotericsoftware.kryonet.Server$1.received(Server.java:61)
    at com.esotericsoftware.kryonet.Connection.notifyReceived(Connection.java:246)
    at com.esotericsoftware.kryonet.Server.update(Server.java:208)
    at com.esotericsoftware.kryonet.Server.run(Server.java:356)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Class is not registered: java.awt.Color

我不明白,因为虽然我注册的类使用 Color 类,但我以前从未注册过 String 对象,所以我看不出这里有什么区别,我该如何解决这个错误?提前感谢您的帮助。

编辑

这是一个最小的可重现代码,在序列化Color 时显示错误:

// this works actually fine
public static void main(String[] args) {
    Kryo kryo = new Kryo();
    kryo.register(Color.class, new JavaSerializer());

    Color color = new Color(15006);

    Output output = new Output(new byte[1024]);
    kryo.writeObject(output, color);

    Input input = new Input(output.getBuffer());
    Color color2 = kryo.readObject(input, Color.class);

    if (!color.equals(color2)) throw new AssertionError();
}

【问题讨论】:

  • 这并不理想。我将扩展KryoRegistrator 并使用一个在TCP 连接的每一侧初始化一个Kryo 实例。这将确保您双方都使用相同的序列化程序注册了相同的类
  • 如果操作正确,它实际上可以与JavaSerializer 一起使用。不知道你的具体问题是什么。我查看了Color 的代码,似乎很多数据将被序列化,而在反序列化后可以重建。我认为您可以放心地使用自定义序列化程序,它会更有效一些,除非重构我们不序列化的私有属性比序列化它们的网络成本更昂贵

标签: java class object illegalargumentexception kryonet


【解决方案1】:

String 必须默认注册。我自己对这个错误有点惊讶,因为我总是能够序列化我没有注册的类,这仅仅是因为 Kryo 拥有用于可序列化类的默认序列化程序。不管怎样,既然java.awt.Color 实现了java.io.Serializable,我就这么做了

kryoRegistrator.register(Color.class, new JavaSerializer());

如果需要,您也可以编写自己的序列化程序(使用 Kryo),但我不确定它是否值得(它只是一个简单的整数序列化,标准库不会低效)。无论如何,如果你想要它,这里就是:

public class ColorSerializer extends Serializer<Color> {
    @Override
    public Color read(Kryo kryo, Input input, Class<Color> clazz) {
        return new Color(input.readInt());
    }

    @Override
    public void write(Kryo kryo, Output output, Color color) {
        output.write(color.getRGB());
    }
}

【讨论】:

  • 我已经这样做了,但现在我得到了这个错误:线程“客户端”com.esotericsoftware.kryonet.KryoNetException 中的异常:反序列化期间出错。在 com.esotericsoftware.kryonet.TcpConnection.readObject(TcpConnection.java:141) 在 com.esotericsoftware.kryonet.Client.update(Client.java:247) 在 com.esotericsoftware.kryonet.Client.run(Client.java:333 ) at java.lang.Thread.run(Thread.java:745) 原因:com.esotericsoftware.kryo.KryoException: Java 反序列化期间出错。
  • 好吧,这令人费解。你有一个可重现的代码吗?你能写一个简单的涉及你的数据类和 Kryo 的代码吗?您也可以尝试为Color 编写自己的 Kryo 序列化程序吗?
  • 我不知道如何创建自己的序列化程序,并且查看文档,我看不到我会覆盖什么。当客户端接收到包含序列化 Color 对象的 TransferMessage 对象时会发生错误。
  • 这非常简单。我会展示给你看,但请尝试为我构建一个重现错误的小示例。我想了解它。
  • 只需输入我拥有的代码即可。要使其小而可重复,基本上需要编写三个全新的程序,所以希望我所拥有的就足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2013-08-25
  • 2014-09-02
  • 1970-01-01
相关资源
最近更新 更多