Kryonet - как получить отправителя (соединение) во время сериализации?

У меня огромная, огромная проблема. Я использую сериализацию AES для пакетов, и здесь возникает проблема.

Сериализаторы в Kryo выглядят так:

public class AESSerializer extends Serializer {
    private final Serializer serializer;

    public AESSerializer (Serializer serializer) {
       this.serializer = serializer;
    }

    public void write (Kryo kryo, Output output, Object object) {
        // USE AES KEY TO ENCRYPT
        // WRITE OBJECT
    }

    public Object read (Kryo kryo, Input input, Class type) {
        // USE AES KEY TO DECRYPT
        // READ OBJECT
    }

}

Проблема в том, что у каждого пользователя должен быть свой SecretAESKey. Я не могу найти способ добраться до списков подключений из сериализатора, и, как я читаю код Kryonet, они его никуда не передают. Мне нужно получить соединение, которое записывает объект, чтобы получить его ключ AES.

Конструктор сериализатора не подходит, потому что сериализатор один для каждого приложения, а не для каждого пользователя.

Ребята, вы хоть представляете, как справляться с такими вещами?


person Community    schedule 06.10.2016    source источник


Ответы (1)


Kryo встроил этот код:

public synchronized void write (Connection connection, ByteBuffer buffer, Object object) {
   output.setBuffer(buffer);
   kryo.getContext().put("connection", connection);
   kryo.writeClassAndObject(output, object);
   output.flush();
}

public synchronized Object read (Connection connection, ByteBuffer buffer) {
   input.setBuffer(buffer);
   kryo.getContext().put("connection", connection);
   return kryo.readClassAndObject(input);
}

В вашем вызове сериализатора:

Connection connection = (Connection) kryo.getContext().get("connection");

И у вас есть связь.

person Community    schedule 07.10.2016