Как исправить ошибку «NotSerializableException: java.time.format.DateTimeFormatter»

Я пытаюсь использовать ObjectOutputStream для сохранения всех объектов в Arraylist в файл. Атрибутом объекта является LocalDate, и всякий раз, когда я пытаюсь записать в файл ошибку NotSerializableException: java.time.format.DateTimeFormatter возвращается, несмотря на отсутствие DateTimeFormatter для любого из LocalDates

Полная ошибка:

java.io.NotSerializableException: java.time.format.DateTimeFormatter
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
    at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1553)
    at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
    at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
    at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)
    at java.base/java.util.ArrayList.writeObject(ArrayList.java:791)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at java.base/java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1130)
    at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1497)
    at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
    at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)
    at BikeNow.saveRent(BikeNow.java:330)
    at BikeNow.main(BikeNow.java:114)

Метод с использованием Object output Stream

public void saveRent() {
        //Create file and object output stream
        try {
            FileOutputStream fos = new FileOutputStream("tmp.dat");
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            //Write array to file
            oos.writeObject(rents);
            oos.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Пример объекта, пытающегося сохранить в файл

rents.add(new Rent(0001, "John Smith", true, "Roubaix Sport", LocalDate.of(2019, 03, 06), LocalDate.of(2019, 04, 05), 30, true));

Класс объекта

import java.io.Serializable;
import java.time.LocalDate;

public class Rent extends Customer implements Serializable {
    private LocalDate startDate;
    private LocalDate endDate;
    private int duration;
    private boolean overdue;

public Rent(int customerID, String customerName,  boolean renting, String bikeRented, LocalDate startDate, LocalDate endDate, int duration, boolean overdue) {
        super(customerID, customerName,  renting, bikeRented);
        this.startDate = startDate;
        this.endDate = endDate;
        this.duration = duration;
        this.overdue = overdue;
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
1 697
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь не так много, но ясно, что вы пытаетесь написать DateTimeFormatter, когда пишете свой объект. Это наводит меня на мысль, что в Customer определен один, но поскольку DTF не реализует Serializable, он взрывается.

Лучшее решение — отредактировать класс Customer для правильной сериализации. Другой вариант — поместить его в класс Rent, но это может оказаться невозможным, если поля являются закрытыми.

После проверки класса Customer я понимаю, что у меня был неиспользуемый DateTimeFormatter, который я случайно скопировал, не осознавая. Удаление, которое решило проблему

Chornologic 09.04.2019 04:26

Другие вопросы по теме