通过 ObjectStream 传递对象时的数据丢失
Data loss when passing objects via ObjectStream
我正在尝试使用 ObjectOutputStream
将对象从服务器传递到客户端。
数据对象 class:
public class DataObject implements Serializable{
private byte dataType;
private Object data;
public DataObject(byte dataType, Serializable data) {
this.dataType = dataType;
this.data = data;
}
玩家class
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;
我用这个代码把它寄走了
os = new ObjectOutputStream(server.getOutputStream());
os.writeObject(new DataObject((byte) 8, this.player));
System.out.println(this.player);
// It has printed out exact object
并通过
获取
DataObject d = (DataObject) is.readObject()
System.out.println(d.getDataType());
System.out.println(d.getData());
System.out.println((Player)d.getData());
打印出来了
8
null
我遇到了什么问题?
我将 Object
修改为 Serializable
private byte dataType;
private Serializable data;
os.writeObject(new DataObject((byte) 8,(Serializable)this.player));
显示的代码没问题。该错误位于其他地方。为了证明这一点,除了不复制和包含不必要的细节外,我还扩展了原始代码以制作 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());
}
}
这会打印:
Player@4fca772d
8
Player@49097b5d
Player@49097b5d
我正在尝试使用 ObjectOutputStream
将对象从服务器传递到客户端。
数据对象 class:
public class DataObject implements Serializable{
private byte dataType;
private Object data;
public DataObject(byte dataType, Serializable data) {
this.dataType = dataType;
this.data = data;
}
玩家class
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;
我用这个代码把它寄走了
os = new ObjectOutputStream(server.getOutputStream());
os.writeObject(new DataObject((byte) 8, this.player));
System.out.println(this.player);
// It has printed out exact object
并通过
获取DataObject d = (DataObject) is.readObject()
System.out.println(d.getDataType());
System.out.println(d.getData());
System.out.println((Player)d.getData());
打印出来了
8
null
我遇到了什么问题?
我将 Object
修改为 Serializable
private byte dataType;
private Serializable data;
os.writeObject(new DataObject((byte) 8,(Serializable)this.player));
显示的代码没问题。该错误位于其他地方。为了证明这一点,除了不复制和包含不必要的细节外,我还扩展了原始代码以制作 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());
}
}
这会打印:
Player@4fca772d
8
Player@49097b5d
Player@49097b5d