Java ObjectInputStream返回一个空对象

Java ObjectInputStream返回一个空对象,java,javafx,Java,Javafx,因此,我试图将一个对象从客户机发送到服务器,然后对这个对象执行一些操作。我验证了发送对象时该对象包含数据。当我在调试器中读取对象时,它的所有属性都为null 下面是我发送对象的位置: private class registerUser extends Task<Void> { Users user; private static final String code = ".register"; private static final

因此,我试图将一个对象从客户机发送到服务器,然后对这个对象执行一些操作。我验证了发送对象时该对象包含数据。当我在调试器中读取对象时,它的所有属性都为null

下面是我发送对象的位置:

private class registerUser extends Task<Void>
{
        Users user;
        private static final String code = ".register";
        private static final String host = "localhost";
        private static final int portNumber = 4444;
        private clientThread clientThread;


    public registerUser(Users user)
    {
        this.user = user;
    }

    @Override
    protected Void call() throws Exception
    {
        try
        {
            Socket socket = new Socket(host, portNumber);
            Thread.sleep(1000);

            //Setup I/O
            ObjectOutputStream outToServerObject = new ObjectOutputStream(socket.getOutputStream());
            //PrintWriter serverOutString = new PrintWriter(socket.getOutputStream(), false);
            InputStream serverInString = socket.getInputStream();

            //serverOutString.println(code);
           // serverOutString.flush();

            outToServerObject.writeObject(user);
            outToServerObject.flush();
        }
        catch (IOException e)
        {
            System.err.println("Fatal Connection error!");
            e.printStackTrace();
        }
        return null;
    }
还有User.java类,它是争论的对象

public class Users implements Serializable
{

    /*
    Variables
    TODO Create a friend list
    */
    private transient IntegerProperty userID;
    private transient StringProperty userName;
    private transient StringProperty firstName;
    private transient StringProperty lastName;
    private transient StringProperty city;
    private transient ObjectProperty<LocalDate> birthday;
    private transient ListProperty<String> musicGenre;
    private transient List<String> musicGenres = new ArrayList<>();
    /**
     * Default constructor.
     */
    public Users()
    {
        this(null,null,null,null,null);
    }

    /**
     * Constructor with some initial data.
     * Takes in a {@code String} and sets a reference
     *
     * @param userName
     *
     */
    public Users(String userName,  String firstName, String lastName, String city, LocalDate birthday)
    {
        this.userName = new SimpleStringProperty(userName);
        this.userID = new SimpleIntegerProperty();
        this.firstName = new SimpleStringProperty(firstName);
        this.lastName = new SimpleStringProperty(lastName);
        this.city = new SimpleStringProperty(city);
        this.birthday = new SimpleObjectProperty<LocalDate>(birthday);
        ObservableList<String> observableList = FXCollections.observableArrayList(this.musicGenres);
        this.musicGenre = new SimpleListProperty<String>(observableList);

    }
}

这是我向
ListProperty
添加项目的唯一方法,但是
observateList
不能序列化就像James_D说的那样,基本上我必须创建自定义
WriteExternal
ReadExternal

Users.java
中,需要进行更改

public class Users implements Externalizable
{
    public Users(String userName,  String firstName, String lastName, String city, LocalDate birthday)
    {
        setUserName(userName);
        setFirstName(firstName);
        setBirthday(birthday);
    }

    private IntegerProperty userID = new SimpleIntegerProperty(this, "id");
    private StringProperty userName = new SimpleStringProperty(this, "userName');
    private ObjectProperty<LocalDate> birthday = new SimpleObjectProperty<>(this, "birthday");

    //Create setters and getters...

    @Override
    public void writeExternal(ObjectOutput out) throws IOException
    {
        out.writeInt(getUserID());
        out.writeObject(getUserName());
        out.writeObject(getBirthday());
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    {
        setUserID((int) in.readInteger());
        setUserName((String) in.readObject());
        setBirthday((LocalDate) in.readObject());
    }
}
公共类用户实现可外部化
{
公共用户(字符串用户名、字符串姓氏、字符串姓氏、字符串城市、LocalDate生日)
{
setUserName(用户名);
setFirstName(firstName);
挫折日(生日);
}
private IntegerProperty userID=新的SimpleIntegerProperty(此“id”);
私有StringProperty用户名=新的SimpleStringProperty(此“用户名”);
private ObjectProperty生日=新的SimpleObject属性(此“生日”);
//创建setter和getter。。。
@凌驾
public void writeExternal(ObjectOutput out)引发IOException
{
writeInt(getUserID());
writeObject(getUserName());
out.writeObject(getBirthday());
}
@凌驾
public void readExternal(ObjectInput in)引发IOException、ClassNotFoundException
{
setUserID((int)in.readInteger());
setUserName(.readObject()中的字符串);
.readObject()中的setBirthday((LocalDate);
}
}
但是 我无法使用下面的方法序列化ListProperty

private ObservableList<String> observableList = FXCollections.observableArrayList();
private ListProperty<String> newList = new SimpleListProperty<>(this, "musicGenre", observableList);
private observeList observeList=FXCollections.observearraylist();
private ListProperty newList=新的SimpleListProperty(这是“musicGenre”,observableList);
出于我的需要,ListProperty需要以这种方式实例化,因为我需要使用
user.newListProperty().get().add(“String”)
向它添加字符串项,如果没有
ObservableList
,我就不能这样做


如果有人知道解决这个问题的方法,我们会很感激的

transient
的意思是“不要序列化这个值”所以这正是你所期望的。JavaFX属性和集合是不可序列化的,您实际上只想序列化它们的值。为此,需要实现自定义序列化。请参阅,或者您也可以使用所谓的DTO对象,该对象具有可序列化的常用类型的属性,如
String
Integer
等。然后将
User
对象转换为
UserDTO
,序列化该DTO,发送它,反序列化,从
UserDTO
构造
Users
对象,并在另一台机器上使用它。或者说,流式JSON。只要
get
set
方法的命名方式相同,您就可以使用JavaFX属性序列化对象,并将其反序列化为表示与常规JavaBean属性相同值的对象,反之亦然。@James\u D除了我的listProperty之外,这工作得很好,我通过创建一个arrayList,然后附加一个FXCollection可观察arrayList来实现它。然后,我创建了一个新的ListProperty作为
新的SimpleListProperty(observableList)。当然,这可以序列化,但这是我将项目添加到列表中的唯一方法。有什么想法吗?
private List<String> musicGenreList = new ArrayList<>();
ObservableList<String> observableList = FXCollections.observableArrayList(musicGenreList);
private ListProperty<String> musicGenre = new SimpleListProperty<String>(observableList);
public class Users implements Externalizable
{
    public Users(String userName,  String firstName, String lastName, String city, LocalDate birthday)
    {
        setUserName(userName);
        setFirstName(firstName);
        setBirthday(birthday);
    }

    private IntegerProperty userID = new SimpleIntegerProperty(this, "id");
    private StringProperty userName = new SimpleStringProperty(this, "userName');
    private ObjectProperty<LocalDate> birthday = new SimpleObjectProperty<>(this, "birthday");

    //Create setters and getters...

    @Override
    public void writeExternal(ObjectOutput out) throws IOException
    {
        out.writeInt(getUserID());
        out.writeObject(getUserName());
        out.writeObject(getBirthday());
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
    {
        setUserID((int) in.readInteger());
        setUserName((String) in.readObject());
        setBirthday((LocalDate) in.readObject());
    }
}
private ObservableList<String> observableList = FXCollections.observableArrayList();
private ListProperty<String> newList = new SimpleListProperty<>(this, "musicGenre", observableList);