Kryonet не получает пользовательские классы

Я пытаюсь настроить базовый клиент и сервер, чтобы освоить работу в сети, но столкнулся с проблемой.

Всякий раз, когда я отправляю класс с одним из моих собственных классов в качестве переменной, сервер его не получает. Я могу прекрасно использовать строку/int/etc для переменной, но всякий раз, когда включается переменная моего собственного типа, она не принимается вместе со всеми объектами, которые я пытаюсь отправить после нее.

Все зарегистрировано в Kryo. Я просто что-то упустил? Любая помощь приветствуется!

Из GameClient:

public GameClient(String name) {
    client = new Client();
    client.start();

    NetworkManager.register(client);

    listener = new ClientListener();
    client.addListener(listener);

    try {
        client.connect(5000, "24.207.67.56", NetworkManager.port);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Login login2 = new Login();
    User user2 = new User(name);
    login2.user = user2;
    login2.name = user2.name;
    client.sendTCP(login2); // server does not recieve this

    Login login = new Login();
    login.name = user.name;
    client.sendTCP(login); // server receives this only when it is sent before the Login containing the User

}

С игрового сервера:

public GameServer() {
    server = new Server();

    NetworkManager.register(server);

    listener = new ServerListener(server);
    server.addListener(listener);

    try {
        server.bind(NetworkManager.port);
    } catch (IOException e) {
        e.printStackTrace();
    }
    server.start();
}

В ServerListener:

@Override
public void received(Connection c, Object o) {
    System.out.println("recieved");
    if (o instanceof Login) {
        System.out.println("[SERVER] " + ((Login) o).name + " logged in.");
        LoginResult lr = new LoginResult();
        lr.result = true;
        c.sendTCP(lr);
    }
}

Из NetworkManager:

public static void register(EndPoint endPoint) {
    Kryo kryo = endPoint.getKryo();
    kryo.register(Login.class);
    kryo.register(User.class);
}

public static class Login {
    public User user;
    public String name;
}

Пользователь:

public class User {
    public String name;

    public User(String name) {
        this.name = name;
    }
}

person Rekkyn    schedule 17.04.2014    source источник
comment
Пожалуйста, включите соответствующие части кода, а не просто описывайте его в общих чертах. Объясните конкретно, чего вы пытаетесь достичь и чем ваши результаты отличаются от желаемых. Прочтите этот совет о том, как задавать правильные вопросы, и этот пост в блоге Как составить идеальный вопрос. Обратите особое внимание на Золотое правило, хотя я настоятельно рекомендую вам прочитать всю статью.   -  person Adi Inbar    schedule 17.04.2014


Ответы (1)


Итак, получается, что проблема была вызвана отсутствием конструктора по умолчанию в классе User. Удаление конструктора User(String name) или добавление простого конструктора User() устраняет проблему.

Было бы полезно, если бы он выдавал ошибку при попытке сделать это неправильно, ну да ладно.

person Rekkyn    schedule 18.04.2014