2

The object class I am writing to disk is defined as follows:

public class EntityTableLink implements Index<Id, List<String>>, Serializable
{
    private Map<Id, Map<String, List<Pair<Integer, Integer>>>> idx;

    public EntityTableLink()
    {
        this.idx = new HashMap<>();
    }

    // Some getters and manipulation methods...
}

I write an instance of the class EntityTableLink, call it obj, to disk the following way:

private void save() throws IOException
{
    ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object_file"));
    outputStream.writeObject(obj);
    outputStream.flush();
    outputStream.close();
}

I read the object from disk the following way:

private void read()
{
    try (ObjectInputStream stream = new ObjectInputStream(new FileInputStream("object_file")))
    {
        EntityTableLink obj = (EntityTableLink) stream.readObject();
    }

    catch (IOException | ClassNotFoundException e)
    {
        // Some exception handling
    }
}

This code generates an OptionalDataException with the following stack trace:

java.io.OptionalDataException
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1702)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
    at java.base/java.util.HashMap.readObject(HashMap.java:1458)
    at java.base/jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1175)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2325)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
    at java.base/java.util.HashMap.readObject(HashMap.java:1460)
    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:566)
    at java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1175)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2325)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
    at java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2464)
    at java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2358)
    at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2196)
    at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1679)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:493)
    at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:451)
    at dk.aau.cs.daisy.edao.loader.IndexReader.loadEntityTableLink(IndexReader.java:111)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

IndexReader.loadEntityTableLink() is the class method that writes the object to disk.

According to different sources, this problem occurs when I am reading an object that contains primitive data, but my class EntityTableLink does not contain primitive data. I have successfully written and read other classes that contain members of similar types.

The EOF flag is set to true, which means EOF was reached earlier than expected. What could be the cause of that?

0 Answers0