0

我正在尝试序列化一个引用另一个对象作为实例变量的对象。我遵循常见的方式,但是我无法在 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() 方法不存在。

4

1 回答 1

0

线

car = (Car)is.readObject();

是错的。汽车不可序列化。

解决方案:

  1. 使汽车可序列化,并删除该行

  2. 使用仅可串行化的 MyCar 对象用于 ser/deser,并从 MyCar 创建汽车,参见第 3 点。

  3. 创建一辆新车:car = new Car(); 但是从哪里获取数据呢?(见第 2 点)

  4. 使用 os.writeObject() 和原语,例如 os.writeInt() 逐一序列化汽车的字段;

  5. 使用您自己的自定义序列化,使用 DataOutputStream

更新您的更新问题的答案

String 是一个对象,你用 os.writeObject(car.type); 序列化它
另请参阅使用解决方案 4 的ObjectOutputStream
代码:

private void writeObject(ObjectOutputStream os){
    try {
        os.defaultWriteObject();
        os.writeObject(car.type);
        os.writeInt(car.speed);
    } catch (IOException e) {
        e.printStackTrace();
    }
}


private void readObject(ObjectInputStream is){
    try {
        is.defaultReadObject();
        String type = (String) is.readObject();
        int speed = is.readInt();
        this.car = new Car(type, speed);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
于 2012-12-11T12:48:41.693 回答