我正在尝试序列化一个引用另一个对象作为实例变量的对象。我遵循常见的方式,但是我无法在 main() 方法中检索第二个对象(它是不可序列化的)。这是我的代码:
public class Car {
String type;
int speed;
public Car(String s, int v){
type = s;
speed = v;
}
}
public class Employee implements Serializable {
String name;
int Id;
transient Car car;
public Employee(String s, int i, Car c){
name = s;
Id = i;
car = c;
}
private void writeObject(ObjectOutputStream os){
try {
os.defaultWriteObject();
os.writeObject(car);
} catch (IOException e) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream is){
try {
is.defaultReadObject();
car = (Car)is.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在主要方法中:
public static void main(String[] args) {
Car c = new Car("noType", 100);
Employee e = new Employee("Aris", 1, c);
try {
FileOutputStream fo = new FileOutputStream("save.txt");
ObjectOutputStream out = new ObjectOutputStream(fo);
out.writeObject(e);
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
FileInputStream fi = new FileInputStream("save.txt");
ObjectInputStream in = new ObjectInputStream(fi);
Employee emp = (Employee) in.readObject(); // Comment
System.out.println(emp.car.speed);
in.close();
}catch (ClassNotFoundException e1) {
e1.printStackTrace();
}
catch (IOException e1) {
e1.printStackTrace();
}
}
在第二个 try 块的“Comment”行上,它会抛出一个 nullPointerException。它不能以这种方式保存 Car 对象。我应该怎么做才能克服它?我当然希望 Car 类保持不可序列化。如果更喜欢保存 Car 对象的实例变量并借助它们及其构造函数重新创建它,我该如何保存(和检索)String 属性?
更新:
尝试仅保存 int 实例变量时,它可以工作。这次的相关方法是:
private void writeObject(ObjectOutputStream os){
try {
os.defaultWriteObject();
os.writeInt(car.speed);
} catch (IOException e) {
e.printStackTrace();
}
}
private void readObject(ObjectInputStream is){
try {
is.defaultReadObject();
car = new Car("theNew", is.readInt());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
但我的问题仍然是如何(或是否)我可以保存整个对象。毕竟我没有设法保存和检索字符串。WriteString()、ReadString() 方法不存在。