java - 反序列化ArrayList中的对象

标签 java arraylist serialization deserialization

我可以将数组列表序列化到文件,但在 Java 中从文件反序列化对象时遇到问题。 这是我的代码:

形状.java

public interface Shape {
    String toString();
}

矩形.java

import java.io.Serializable;

public class Rectangle implements Shape, Serializable {
    private double length;
    private double width;

    public Rectangle(double width, double length) {
        this.width = width;
        this.length = length;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public double getLength() {
        return length;
    }

    public void setLength(double length) {
        this.length = length;
    }

    @Override
    public String toString() {
        return "Rectangle{" +
                "width=" + width +
                ", length=" + length +
                '}';
    }
}

圆.java

import java.io.Serializable;

public class Circle implements Shape, Serializable {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    public double getRadius() {
        return radius;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    @Override
    public String toString() {
        return "Circle{" +
                "radius=" + radius +
                '}';
    }
}

形状.java

import java.io.Serializable;
import java.util.ArrayList;

public class Shapes implements Serializable {
    private  ArrayList<Shape> shapeList = new ArrayList<>();

    public Shapes() {
    }

    public Shapes(ArrayList<Shape> shapeList) {
        this.shapeList = shapeList;
    }

    public ArrayList<Shape> getShapeList() {
        return shapeList;
    }

    public void setShapeList(ArrayList<Shape> shapeList) {
        this.shapeList = shapeList;
    }

    @Override
    public String toString() {
        return "Shapes{" +
                "shapeList=" + shapeList +
                '}';
    }

    public void add(Shape shape) {
        shapeList.add(shape);
    }
}

Main.java

import java.io.*;
import java.util.ArrayList;

public class Main extends Thread {

    public static void main(String[] args) {
        Shapes shapes = new Shapes();

        Rectangle r1 = new Rectangle(5, 10);
        Rectangle r2 = new Rectangle(12, 15);
        Circle c1 = new Circle(5);
        Circle c2 = new Circle(8);

        shapes.add(r1);
        shapes.add(r2);
        shapes.add(c1);
        shapes.add(c2);

        // Serialization
        try {
            FileOutputStream streamOut = new FileOutputStream("./obj.ser");
            ObjectOutputStream objectOutput = new ObjectOutputStream(streamOut);
            objectOutput.writeObject(r1);
            objectOutput.close();
            streamOut.close();
        } catch (IOException e) {
            System.out.println(e);
        }
        System.out.println();

        // DeSerialization
        Shapes shapes2 = new Shapes();
        try {
            FileInputStream streamIn = new FileInputStream("./obj.ser");
            ObjectInputStream objectInput = new ObjectInputStream(streamIn);
            shapes2 = (Shapes) objectInput.readObject();
            objectInput.close();
            streamIn.close();
        } catch (IOException | ClassNotFoundException e) {
            System.out.println(e);
            return;
        }
        System.out.println(shapes2.toString());
    }

}

我不知道如何修复命令中显示的错误:

Exception in thread "main" java.lang.ClassCastException: class Rectangle cannot be cast to class Shapes (Rectangle and Shapes are in unnamed module of loader 'app') at Main.main(Main.java:74)

最佳答案

序列化部分

objectOutput.writeObject(r1); // write a Rectangle

反序列化部分

shapes2 = (Shapes) objectInput.readObject(); // try to read Shapes instead of Shape or Rectangle

所以解决方案是这样的:

形状 shape = (Shape) objectInput.readObject();

矩形 r = (矩形) objectInput.readObject();

关于java - 反序列化ArrayList中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61316238/

相关文章:

c# - 为什么我无法在 C# 中序列化元组?

java - Wicket 应用程序、序列化和 Java 计时器

java - 在 Drools 中为组执行单个规则

java - 最后阻止在 Oracle 的 JAVA 存储过程中不起作用

java - 二维数组填充不起作用

java - 如何迭代字符串列表以将每个单词的最后一个字母更改为大写?

Java:如何将对象序列化为字节数组并使用尽可能少的输出字节?

java - 跟踪字符串中的括号

Java Swing 从复选框中删除 LAF 样式

Java for 循环变成负数?