Java 通过ObjectStream传递对象时数据丢失

Java 通过ObjectStream传递对象时数据丢失,java,serversocket,Java,Serversocket,我正在尝试使用ObjectOutputStream将对象从服务器传递到客户端。 数据对象类: public class DataObject implements Serializable{ private byte dataType; private Object data; public DataObject(byte dataType, Serializable data) { this.dataType = dataType; this.data = d

我正在尝试使用
ObjectOutputStream
将对象从服务器传递到客户端。 数据对象类:

public class DataObject implements Serializable{
    private byte dataType;
    private Object data;

public DataObject(byte dataType, Serializable data) {
    this.dataType = dataType;
    this.data = data;
}
球员级别

public class Player implements Serializable{
    private int mana, health;
    private List<Integer> hand, grave, deck, used;
    private Effect healing, posioned, grievousWound, exhaust, resistance, power;
    private Player enemy;
然后带上它

DataObject d = (DataObject) is.readObject()
System.out.println(d.getDataType());
System.out.println(d.getData());
System.out.println((Player)d.getData());
它已经打印出来了

8
null
我有什么问题

我将
对象
固定为
可序列化

private byte dataType;
private Serializable data;

os.writeObject(new DataObject((byte) 8,(Serializable)this.player));
显示的代码正常(ish)。虫子在别的地方。为了证明这一点,我扩展了原始代码以生成MRE,而不是复制和包含不必要的细节

import java.io.*;
import java.util.*;

class DataObject implements Serializable{
    private byte dataType;
    private Object data;
    public DataObject(byte dataType, Object data) {
        this.dataType = dataType;
        this.data = data;
    }
    public byte getDataType() { return dataType; }
    public Object getData() { return data; }

}
class Effect implements Serializable { }
class Player implements Serializable {
    private int mana, health;
    private List<Integer> hand, grave, deck, used;
    private Effect healing, posioned, grievousWound, exhaust, resistance, power;
    private Player enemy;
}
class Code {
    private final Player player = new Player();

    public static void main(String[] args) throws Throwable {
        new Code().go();
    }

    public void go() throws Throwable {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (ObjectOutputStream os = new ObjectOutputStream(out)) {
            os.writeObject(new DataObject((byte) 8, this.player));
            System.out.println(this.player);
        }
        ObjectInputStream is = new ObjectInputStream(
            new ByteArrayInputStream(out.toByteArray())
        );
        DataObject d = (DataObject) is.readObject();
        System.out.println(d.getDataType());
        System.out.println(d.getData());
        System.out.println((Player)d.getData());
    }
}

播放器实现可序列化吗?请发布。@MarcosVasconcelos我发布了it@Mido,我问player是否实现Serializable,您提供的代码没有显示类的部分declaration@TomHawtin-tackline My
DataObject
类以不同的方法稳定工作。但如果
数据
=播放器,则不工作
import java.io.*;
import java.util.*;

class DataObject implements Serializable{
    private byte dataType;
    private Object data;
    public DataObject(byte dataType, Object data) {
        this.dataType = dataType;
        this.data = data;
    }
    public byte getDataType() { return dataType; }
    public Object getData() { return data; }

}
class Effect implements Serializable { }
class Player implements Serializable {
    private int mana, health;
    private List<Integer> hand, grave, deck, used;
    private Effect healing, posioned, grievousWound, exhaust, resistance, power;
    private Player enemy;
}
class Code {
    private final Player player = new Player();

    public static void main(String[] args) throws Throwable {
        new Code().go();
    }

    public void go() throws Throwable {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (ObjectOutputStream os = new ObjectOutputStream(out)) {
            os.writeObject(new DataObject((byte) 8, this.player));
            System.out.println(this.player);
        }
        ObjectInputStream is = new ObjectInputStream(
            new ByteArrayInputStream(out.toByteArray())
        );
        DataObject d = (DataObject) is.readObject();
        System.out.println(d.getDataType());
        System.out.println(d.getData());
        System.out.println((Player)d.getData());
    }
}
Player@4fca772d
8
Player@49097b5d
Player@49097b5d