我们可以 read/write 同一父 class 的不同类型子 class 到一个文本文件吗?

Can we read/write different type child classes of the same parent class to a textfile?

假设我有一个抽象 class“车辆”和另外 2 个继承自车辆 class 的子 classes,称为“汽车”和“自行车”。

所以我可以随机创建一系列汽车和自行车对象:

Vehicle car = new Car();
Vehicle bike = new Bike();

并将它们全部添加到一个数组列表中:

Arraylist<Vehicle> vehicles = new Arraylist<>();

是否可以将这些对象写入单个文本文件,并根据特定对象类型(汽车、自行车)将其从文本文件读回 Arraylist,而无需为每种类型维护不同的文本文件

是的,

如果抽象 class 实现了可序列化接口,您实际上也可以序列化子 classes。

因此,通过使车辆 class 可序列化,您可以遍历数组列表并使用 ObjectOutputStreamFileOutputStream 序列化子对象。

参考:https://www.geeksforgeeks.org/object-serialization-inheritance-java/

如果你想在文件中存储对象,我建议你使用对象序列化。 This link 包含有关如何序列化和反序列化列表的有用详细信息

这是序列化列表的方式:

ArrayList<Vehicle> vehicles= new ArrayList<>();
         
        vehicles.add(new Vehicle());
        vehicles.add(new Bike());
        vehicles.add(new Car());
 
        try
        {
            FileOutputStream fos = new FileOutputStream("vehiclesData");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(vehicles);
            oos.close();
            fos.close();
        } 
        catch (IOException ioe) 
        {
            ioe.printStackTrace();
        }

要反序列化,请使用以下内容:


        ArrayList<Vehicle> vehicles= new ArrayList<>();
         
        try
        {
            FileInputStream fis = new FileInputStream("vehiclesData");
            ObjectInputStream ois = new ObjectInputStream(fis);
 
            vehicles= (ArrayList) ois.readObject();
 
            ois.close();
            fis.close();
        } 
        catch (IOException ioe) 
        {
            ioe.printStackTrace();
            return;
        } 
        catch (ClassNotFoundException c) 
        {
            System.out.println("Class not found");
            c.printStackTrace();
            return;
        }
         
        //Verify list data
        for (Vehicle vehicle : vehicles) {
            System.out.println(vehicle);
        }

确保你所有的类实现serializable接口