使用ObjectInputStream.ReadObject()Java optionalDataException
我写给磁盘的对象类的定义如下:
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...
}
我编写类的实例 entityTableLink ,称其为 obj ,以磁盘为以下方式:
private void save() throws IOException
{
ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("object_file"));
outputStream.writeObject(obj);
outputStream.flush();
outputStream.close();
}
我读取对象从磁盘上以下方式:
private void read()
{
try (ObjectInputStream stream = new ObjectInputStream(new FileInputStream("object_file")))
{
EntityTableLink obj = (EntityTableLink) stream.readObject();
}
catch (IOException | ClassNotFoundException e)
{
// Some exception handling
}
}
此代码使用以下堆栈跟踪生成 optionalDataException :
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()是将对象写入磁盘的类方法。
根据不同的来源,当我读取包含原始数据的对象时,就会发生此问题,但是我的类 entityTableLink 不包含原始数据。我已经成功编写并阅读了包含类似类型的成员的其他类。
EOF FLAG设置为True,这意味着EOF比预期的要早。这可能是什么原因?
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论