Я пытаюсь отправить List <Employee>с сервера на клиент, используя Custom Serialization, но readObject ничего не возвращает - PullRequest
0 голосов
/ 04 мая 2020

Итак, у меня есть задание, которое мне нужно сделать для учебы в колледже. Назначение - создать приложение клиент-сервер с использованием OCSF (Object Client Server Framework) и отобразить простое табличное представление на стороне клиента с данными из mySql, находящимися на стороне сервера, таким образом, чтобы его можно было редактировать прямо из GUI (реализация JavaFX).

Я почти три дня пытаюсь выполнить эту работу безуспешно.

Весь поток данных от клиента к серверу и наоборот должен быть сериализован. У меня было бесконечное количество проблем во время написания кода, но две из них я «едва исправил»: * ObservableList необходим для опции обновления таблицы из GUI, но это не-сериализуемый объект, поэтому я изменил его на ArrayList, чтобы я мог преобразовать его в ObservableList на стороне клиента.

* Чтобы использовать параметры bean-компонента JavaFX, такие как setCellValueFactory(new PropertyValueFactory<>("....") Мне нужно было использовать stringProperty внутри класса Employee вместо String для сохранения экземпляра. данные, но stringProperty не является сериализуемым.

Метод, который я нашел для решения этой проблемы в Stackoverflow, заключался в создании настраиваемой сериализации класса Employee и ручной записи всех данных полей Employee в ObjectOutputStream. НО это не работает.

Проблема, с которой я сейчас сталкиваюсь и которую я действительно пытался решить безуспешно, заключается в том, что ObjectInputStream.readObject возвращает пустое значение.

Это класс Employee:

public class Employee extends User implements Serializable{

    private static final long serialVersionUID = 4591080419112442854L;
    private transient StringProperty EmployeeID, Role, Department;

    public Employee(String employeeid, String role, String department, String firstname, String lastname, 
            String email, String username, String password) {
        super(username, password, firstname, lastname, email);
        this.Department = new SimpleStringProperty(this, department);
        this.Role = new SimpleStringProperty(this, role);
        this.EmployeeID = new SimpleStringProperty(this, employeeid);;
    }

    /* ~~~~~~ Serialization Methods ~~~~~~ */

    private void writeObject(ObjectOutputStream out)
            throws IOException {
                out.writeObject(Department.get());
                out.writeObject(Role.get());
                out.writeObject(EmployeeID.get());
                out.writeObject(firstname.get());
                out.writeObject(lastname.get());
                out.writeObject(email.get());
                out.writeObject(username.get());
                out.writeObject(password.get());

    }
    private void readObject(ObjectInputStream in)
    throws IOException,
           ClassNotFoundException {

        in.defaultReadObject();    // always call this first

        Department = new SimpleStringProperty((String) in.readObject());
        Role = new SimpleStringProperty((String) in.readObject());
        EmployeeID = new SimpleStringProperty((String) in.readObject());
        firstname = new SimpleStringProperty((String) in.readObject());
        lastname = new SimpleStringProperty((String) in.readObject());
        email = new SimpleStringProperty((String) in.readObject());
        username = new SimpleStringProperty((String) in.readObject());
        password = new SimpleStringProperty((String) in.readObject());
    }

    //////////////////////////////////////////

    public StringProperty employeeIDProperty() {
        return this.EmployeeID;
    }
    public StringProperty roleProperty() {
        return this.Role;
    }
    public StringProperty departmentProperty() {        
        return this.Department;
    }
    public void setEmployeeID(String EmployeeID) {
        if(EmployeeID != null) {
            this.EmployeeID.set(EmployeeID);
        }
    }
    public void setEmployeeRole(String Role) {
        if(Role != null) {
            this.Role.set(Role);
        }
    }
    public void setEmployeeDep(String Department) {
        if(Department != null) {
            this.Department.set(Department);
        }
    }
}

Я попытался отладить программу и посмотреть, что «под капотом», когда программа входит в методы writeObject и readObject. Единственное, что я заметил, и я не могу найти какую-либо связь с моей проблемой, но, возможно, вы это сделаете, это то, что процесс чтения и процесс записи выполняются разными потоками (что я считаю обязательным), и что ObjectOutputStream содержит больше объектов принадлежащий OCSF (Framework), а не только данные, которые я пытался добавить.

Так что, после долгих часов попыток, я как бы сдался. Мне действительно нужна помощь с этим. Может быть, у кого-то есть представление о том, что может вызвать такое поведение? Может быть, еще одна идея о том, как передать данные с mysql на сервер клиенту, отобразить их и дать возможность изменить данные с GUI?

Буду признателен за любой совет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...