java - 从文件中读取某些对象时为 `java.io.StreamCorruptedException: unexpected end of block data`

标签 java serialization deserialization

我有一些非常基本的序列化代码:

void serializeObjectToFile(Serializable serializable, File file) {
    ObjectOutputStream stream = null;
    try {
        stream = new ObjectOutputStream(new FileOutputStream(file));
        stream.writeObject(serializable);
        stream.flush();
    } catch (Exception exception) {
        logger.error("Failed to serialize object: {}.", serializable, exception);
    } finally {
        if (stream != null) {
            try {
                stream.close();
            } catch (IOException exc) {
                logger.error("Error closing stream.", exc);
            }
        }
    }
}

还有一些非常反序列化的代码:

Object deserializeObjectFromFile(File file) {
    ObjectInputStream oiStream = null;
    try {
        oiStream = new ObjectInputStream(new FileInputStream(file));
        return oiStream.readObject();
    } catch (Exception exc) {
        logger.error("Exception loading object from file '{}'.", file.getAbsolutePath(), exc);
    } finally {
        if (oiStream != null) {
            try {
                oiStream.close();
            } catch (IOException exc) {
                logger.error("Error closing stream.", exc);
            }
        }
    }
    return null;
}

此代码适用于大多数对象。但是对于某些对象,我得到以下异常:

java.io.StreamCorruptedException: unexpected end of block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) ~[na:1.6.0_29]
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29]
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) ~[na:1.6.0_29]
at java.util.ArrayList.readObject(ArrayList.java:593) ~[na:1.6.0_29]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.6.0_29]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) ~[na:1.6.0_29]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) ~[na:1.6.0_29]
at java.lang.reflect.Method.invoke(Method.java:597) ~[na:1.6.0_29]
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29]
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) ~[na:1.6.0_29]
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) ~[na:1.6.0_29]
at my.CustomClass.deserializeObjectFromFile(CustomClass.java:79) ~[classes/:na]

我不会尝试为每个文件序列化多个对象(正如该主题的其他问题所建议的那样)。该代码适用于大多数对象,但不适用于某些对象。由于 ArrayList.readObject() 出现在堆栈跟踪中:这与问题有关吗?如果是这样,什么?令我惊讶和沮丧的是,我在网上找不到任何关于该问题的信息...

我很感激任何关于从这里去哪里的指示......!

最佳答案

我发现了问题:对象图中深处的对象之一实现了以下方法:

private void writeObject(java.io.ObjectOutputStream out) throws IOException

实际上没有将其内部写入 ObjectOutputStream 并且没有抛出异常(该方法是为了验证目的而实现的)。所以解决方案:在实现此方法时,要么抛出某种Exception,要么将对象的内部结构写入ObjectOutputStream。最简单的就是打电话

out.defaultWriteObject();

关于java - 从文件中读取某些对象时为 `java.io.StreamCorruptedException: unexpected end of block data`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185719/

相关文章:

java - 跨不同 Android 版本保存/加载 ArrayList

c# - 当 Newtonsoft.JSON 反序列化失败时,有没有办法返回自定义错误?

java - 使用客户模型的 Gson 反序列化

java - 无法初始化 GXT GWT 中的类

java - 如何在其他方法调用中使用传递的参数?

c# - 基元序列化

java - 如何使用GSON将JSON反序列化为不同字段的对象

java - 使用 Jackson 将 JSON 数组反序列化为具有私有(private)列表属性的对象

java - ViewTreeObserver onPreDrawListener 发生 ConcurrentModificationException

java - 如何在 webdriver 中有效地使用流畅的等待命令?