При десериализации некоторых объектов из файла .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;
}
}
Как это можно исправить? Сохранено ли что-то повреждено при сериализации?