Ошибка переполнения стека при десериализации двоичного файла - PullRequest
0 голосов
/ 04 ноября 2019

Итак, я пытаюсь сохранить информацию в списке массивов объектов, однако все работает, всякий раз, когда я пытаюсь загрузить ранее сохраненный список массивов, я получаю ошибку переполнения стека.

Я предполагаю, что мне нужноОднако, я не знаком с Java и с тем, как работает десериализатор. Я приложил свой код ниже - любая помощь будет оценена.

ArrayList<Car> cars = new ArrayList<Car>();

public void addCar
{
     System.out.println("What is the make of the car?");
     String newMake = scan.next();
     System.out.println("What is the model of the car?");
     String newModel = scan.next();
     System.out.println("What year was the car produced?");
     String newYear = scan.next();
     System.out.println("How far has this car traveled?");
     String newOdometer = scan.next();
     cars.add(new Car(newMake, newModel, newYear, newOdometer));   
}

public void openFile()
    {
        Car cars = new Car();
      try {
         FileInputStream fileIn = new FileInputStream("testSave.plzwork");
         ObjectInputStream in = new ObjectInputStream(fileIn);
            try {
                cars = (Car)in.readObject();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(carClass.class.getName()).log(Level.SEVERE, null, ex);
            }
         in.close();
         fileIn.close();
        }
        catch (IOException i) {
         i.printStackTrace();
        }
    }

РЕДАКТИРОВАТЬ Вот код сериализации

public void saveFile()
    { 
        try 
        {
            FileOutputStream fileOut = new FileOutputStream("testSave.plzwork");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(cars);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved");
        } 
        catch (IOException i) {
        i.printStackTrace();
      }
    }

РЕДАКТИРОВАТЬ 2 Вот класс машины

public Car(String year, String odometer, String make, String model)
    {
        this.make = make; 
        this.model = model; 
        this.year = year; 
        this.odometer = odometer; 
    }

Вот ошибка, которую выдает Netbeans

Исключение в потоке "main" java.lang.StackOverflowError на java.base / java.lang.AbstractStringBuilder.setLength (AbstractStringBuilder.java:277) в java.base / java.lang.StringBuffer.setLength (StringBuffer.java:233) в java.base / java.text.DecimalFormat.expandAffix в десятичном формате в формате 29java.base / java.text.DecimalFormat.expandAffixes (DecimalFormat.java:2946) в java.base / java.text.DecimalFormat.applyPattern (DecimalFormat.java:3632) в java.base / java.text.DecimalFormat. (DecimalFormat).java: 466) по адресу java.base / sun.util.locale.provider.NumberFormatProviderImpl.getInstance (NumberFormatProviderImpl.java:187) по адресу java.base / sun.util.locale.provider.NumberFormatProviderImpl.getNumberInstiderImpI15Imp1151mp1151) в java.base / java.text.NumberFormat.getInstance (NumberFormat.java:969) в java.base / java.text.NumberFormat.getInstance (NumberFormat.java:953) в java.base / java.text.NumberFormat.getNumberInstance (NumberFormat.java:518) в java.base / java.util.Scanner.useLocale (Scanner.java:1270) в java.base / java.util.Scanner. (Scanner.java:543) в java.base / java. util.Scanner. (Scanner.java:566) на pkg30000969carsarraylist.Car. (Car.java:29) на pkg30000969carsarraylist.Car. (Car.java:46) на pkg30000969carsarraylist.Car. (Car.java:rakark4696) на parg. Автомобиль (Car.java:46) в pkg30000969carsarraylist.Car. (Car.java:46) в pkg30000969carsarraylist.Car. (Car.java:46) в pkg30000969carsarraylist.Car. (Car.java:46) в pkg300racar9(Car.java:46) в pkg30000969carsarraylist.Car. (Car.java:46) в pkg30000969carsarraylist.Car. (Car.java:46) в pkg30000969carsarraylist.Car. (Car.java:46)

1 Ответ

0 голосов
/ 04 ноября 2019

Вам необходимо ознакомиться с основами сериализации и десериализации

. Выявлены следующие проблемы с вашим кодом.

  1. Поскольку вы сериализуете данные автомобиля, класс автомобилядолжен реализовывать Serializable интерфейс
public class Car implements Serializable {

    private String make;
    private String model;
    private String year;
    private String odometer;

    public Car(){}

    public Car(String year, String odometer, String make, String model)
    {
        this.make = make;
        this.model = model;
        this.year = year;
        this.odometer = odometer;
    }
}

Поскольку вы добавляете список автомобилей в файл, а при десериализации он будет списком автомобилей, а не автомобилем, поэтому приведение к автомобилю не удастся изменить
cars = (Car)in.readObject();
на
ArrayList<Car> cars = (ArrayList<Car>) in.readObject();

Аргументы конструктора не в порядке public Car(String year, String odometer, String make, String model)
против
cars.add(new Car(newMake, newModel, newYear, newOdometer));, поэтому ваше отображение будет
newMake -> year,
newModel -> одометр,
newYear -> марка,
newOdometer -> модель

Итак, наконец, рабочий код


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

public class JavaBinaryFile {

    static ArrayList<Car> cars = new ArrayList<>();

    public static void main(String[] args) {
        addCar();
        saveFile();
        openFile();
    }

    public static void addCar() {
        Scanner scan = new Scanner(System.in);

        System.out.println("What is the make of the car?");
        String newMake = scan.next();
        System.out.println("What is the model of the car?");
        String newModel = scan.next();
        System.out.println("What year was the car produced?");
        String newYear = scan.next();
        System.out.println("How far has this car traveled?");
        String newOdometer = scan.next();
        cars.add(new Car(newMake, newModel, newYear, newOdometer));
    }

    public static void openFile() {
        try {
            FileInputStream fileIn = new FileInputStream("testSave.plzwork");
            ObjectInputStream in = new ObjectInputStream(fileIn);
            try {
                ArrayList<Car> cars = (ArrayList<Car>) in.readObject();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Car.class.getName()).log(Level.SEVERE, null, ex);
            }
            in.close();
            fileIn.close();
        } catch (IOException i) {
            i.printStackTrace();
        }
    }

    public static void saveFile() {
        try {
            FileOutputStream fileOut = new FileOutputStream("testSave.plzwork");
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            out.writeObject(cars);
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved");
        } catch (IOException i) {
            i.printStackTrace();
        }
    }
}


...