Я использую 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
и использовал его для инициализации одного экземпляраKryo
на каждой стороне TCP-соединения. Это означает, что обе стороны зарегистрировали одни и те же классы с одними и теми же сериализаторами. - person Dici   schedule 01.10.2015JavaSerializer
, если все сделано правильно. Не знаю, в чем ваша точная проблема. Я посмотрел на кодColor
, и кажется, что много данных будет сериализовано, тогда как их можно просто реконструировать после десериализации. Я думаю, что вы можете смело придерживаться обычного сериализатора, он немного эффективнее, если только реконструкция частных атрибутов, которые мы не сериализуем, не дороже, чем сетевые затраты на их сериализацию. - person Dici   schedule 01.10.2015