简体   繁体   English

发送对象时出现Java Kryonet错误

[英]Java Kryonet Error when sending object

I am using Kryonet for TCP sending of objects, particularly one called TransferMessage: 我正在使用Kryonet进行对象的TCP发送,特别是一种称为TransferMessage的对象:

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

Now, I know that I have to call kryo.register(TransferMessage.class) but when I attempt to connect to the server with all the classes registered, I get an error: 现在,我知道我必须调用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

I don't understand because although my registered class uses the Color class, I never before had to register String objects, so I don't see what the difference here is, and how would I fix this error? 我不明白,因为尽管我的注册类使用Color类,但我以前从未注册过String对象,所以我看不出有什么区别,以及如何解决此错误? Thank you in advance for your help. 预先感谢您的帮助。

EDIT : 编辑

Here is a minimal reproducible code showing an error while serializing Color : 这是最小的可复制代码,在序列化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();
}

String must be registered by default. String必须默认注册。 I'm a bit surprised of this error myself because I always have been able to serialize classes I did not register simply because Kryo possesses default serializers for trivially serializable classes. 我自己对此错误感到有些惊讶,因为我一直能够序列化我没有注册的类,这仅仅是因为Kryo拥有用于琐碎可序列化类的默认序列化器。 Anyway, since java.awt.Color implements java.io.Serializable , I would just do 无论如何,由于java.awt.Color实现了java.io.Serializable ,所以我只会

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

You can also write your own serializer (using Kryo) if you want, but I'm not sure it's worth it (it's just a simple integer to serialize, there is no way the standard library does it inefficiently). 您也可以根据需要编写自己的序列化程序(使用Kryo),但我不确定是否值得(它只是序列化的一个简单整数,标准库无法有效地做到这一点)。 If you want it anyway, here it is : 无论如何,这里是:

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());
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM