Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在ArrayList中反序列化对象_Java_Arraylist_Serialization_Deserialization - Fatal编程技术网

Java 在ArrayList中反序列化对象

Java 在ArrayList中反序列化对象,java,arraylist,serialization,deserialization,Java,Arraylist,Serialization,Deserialization,我可以将arraylist序列化为文件,但在Java中从文件反序列化对象时遇到问题。 这是我的密码: Shape.java public interface Shape { String toString(); } Rectangle.java import java.io.Serializable; public class Rectangle implements Shape, Serializable { private double length; priva

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

Shape.java

public interface Shape {
    String toString();
}
Rectangle.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 +
                '}';
    }
}
Shapes.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.lang.ClassCastException中的异常:类 无法将矩形转换为类形状(矩形和形状在 Main.Main(Main.java:74)处加载程序“app”的未命名模块


因为
矩形
不是
形状
,而是
形状

序列化部分

objectOutput.writeObject(r1);//写一个矩形
反序列化部分

shapes2=(Shapes)objectInput.readObject();//尝试读取形状而不是形状或矩形
因此,解决方案是:

Shape Shape=(Shape)objectInput.readObject()

rectangler=(Rectangle)objectInput.readObject()

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

}