Десериализация объектов в ArrayList - PullRequest
0 голосов
/ 20 апреля 2020

Я могу сериализовать массив в файл, но у меня возникают проблемы с десериализацией объекта из файла в 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 +
                '}';
    }
}

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

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

}

Я не знаю, как исправить ошибку, показанную в команде:

Исключение в потоке "main" java .lang.ClassCastException: класс Rectangle не может быть приведен к классу Shapes (Rectangle и Shapes находятся в безымянном модуле загрузчика 'app') в Main.main (Main. java: 74)

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Часть сериализации

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

Часть десериализации

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

Итак, решение может быть следующим:

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

или

Rectangle r = (Rectangle) objectInput.readObject();

0 голосов
/ 20 апреля 2020

Потому что Rectangle не Shapes, а Shape.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...