OptionalDataException при десериализации карты как найти точную причину? - PullRequest
0 голосов
/ 18 марта 2020

При десериализации некоторых объектов из файла .ser я получил java.io.OptionalDataException

    public static void main(String[] args) throws Exception {

        try {
            ObjectInputStream is = new ObjectInputStream(new FileInputStream(extentFile));
            BusinessObject.readExtents(is);
            is.close();

            BusinessObject.showExtent(Product.class);

            BusinessObject.showExtent(Client.class);

            BusinessObject.showExtent(Store.class);

            BusinessObject.showExtent(ShoppingCart.class);  
        } catch(OptionalDataException e) {
            e.printStackTrace();
            System.out.println(e.eof);
            System.out.println(e.length);
        }
    }
}

:

java.io.OptionalDataException
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at BusinessObject.readExtents(BusinessObject.java:72)
    at TestLoadingExtension.main(TestLoadingExtension.java:18)
false
1024

, поэтому он указывает, что следующий элемент в потоке является примитивным, но понятия не имею, как получилось. У меня есть все, что помещено в объекты.

Мой класс, который обрабатывает расширение

public abstract class BusinessObject implements Serializable {

    private static final long serialVersionUID = -4398523594079500765L;

    private static Map<Class, List<BusinessObject>> allExtents = new Hashtable<Class, List<BusinessObject>>();

    public BusinessObject() {
        List extent = null;
        Class theClass = this.getClass();

        if (allExtents.containsKey(theClass)) {
            extent = allExtents.get(theClass);
        } else {
            extent = new ArrayList();
            allExtents.put(theClass, extent);
        }

        extent.add(this);
    }

    public static <T> Iterable<T> getExtent(Class<T> type) throws ClassNotFoundException {
        if (allExtents.containsKey(type)) {
            return (Iterable<T>) allExtents.get(type);
        }

        throw new ClassNotFoundException(String.format("%s. Stored extents: %s", type.toString(), allExtents.keySet()));
    }

    public static void showExtent(Class theClass) throws Exception {
        List extent = null;

        if (allExtents.containsKey(theClass)) {
            extent = allExtents.get(theClass);
        } else {
            throw new Exception("Unknown class " + theClass);
        }

        System.out.println("Extent of the class: " + theClass.getSimpleName());

        for (Object obj : extent) {
            System.out.println(obj);
        }
    }

    public static void writeExtents(ObjectOutputStream stream) throws IOException {
        stream.writeObject(allExtents);
    }

    public static void readExtents(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        allExtents = (Map<Class, List<BusinessObject>>) stream.readObject();
    }

    public static void clearExtension() {
        allExtents = null;
    }
}

Как это можно исправить? Сохранено ли что-то повреждено при сериализации?

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