Java 通过序列化检索对象

Java 通过序列化检索对象,java,string,object,serialization,Java,String,Object,Serialization,我试图序列化一个对象,该对象引用另一个对象作为实例变量。我遵循常见的方法,但是我不能在main()方法中检索第二个对象(不可序列化)。这是我的密码: public class Car { String type; int speed; public Car(String s, int v){ type = s; speed = v; } } } 在主要方法中: public static void main(String[] args) { Car c = ne

我试图序列化一个对象,该对象引用另一个对象作为实例变量。我遵循常见的方法,但是我不能在main()方法中检索第二个对象(不可序列化)。这是我的密码:

 public class Car {

String type;
int speed;

public Car(String s, int v){
    type = s;
    speed = v;
}
}

}

在主要方法中:

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对象的instrance变量并借助它们及其构造函数重新创建它,如何保存(并检索)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()方法 不存在

线路

car = (Car)is.readObject();
这是错误的。 汽车是不可序列化的

解决方案:

  • 使汽车可串行化,并移除线路

  • 使用仅可用于ser/deser目的的MyCar对象,并从MyCar创建car,请参见第3点

  • 创建新车:Car=新车();但是从哪里获得数据呢?(见第2点)

  • 使用os.writeObject()和os.writeInt()等原语逐个序列化car字段

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

  • 更新回答您的更新问题

    字符串是一个对象,您可以使用os.writeObject(car.type)序列化它
    另见
    使用解决方案4编写代码:

    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();
        }
    }
    

    我们可以知道为什么在您尝试序列化或至少反序列化汽车时,您不希望汽车是可序列化的吗?这只是一个示例代码。假设我没有访问类的权限,所以我不能修改它的代码。好吧,这并不是说你们不想,而是你们不能使它可序列化。但是您可以编写一个可序列化的类来获取所有参数,对吗?在序列化时,您将序列化该文件。在反序列化时,您使用该替代品创建了一辆汽车?请参见下面的我的ANWR,使用os.writeObject();用完整代码再次更新了我的答案我认为defaultReadObject指的是Employee对象。我正试图保存和检索这个对象。@AlexWien:Car类是瞬态的,如果不是,则无所谓serializable@Bhavik沙阿,你错了,现在是第二次了,所以请取消你的否决票:一门课永远不会是暂时的!!,成员车是暂时的,它不像他那样在自序列化中发挥作用@亚历克斯维恩:OP正在试图将Employee对象存储到文件中,而不是存储到Car中。由于Employee对象中的Car变量是暂时的,所以不管类Car是可序列化的还是notAnyway类Car不能序列化的。这就是我问题的重点。如何正确地实现readObject()、writeObject()方法来检索汽车。我几乎可以肯定这是可以做到的。我在我的更新中显示,通过一个简单的int变量,它可以工作。
    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();
        }
    }