NotSerializableException转换为InputStream时发生异常

时间:2013-12-11 04:30:37

标签: java serialization inputstream

当我将字节数组转换为Inputstream时,它会产生NotSerializableException异常。 (请参阅下面的代码)

// return type of myBO.getAttachedFile() is byte[]
InputStream inputStream = new ByteArrayInputStream(myBO.getAttachedFile());

我已经检查了方法myBO.getAttachedFile()的返回,它是序列化的。所以我的问题是为什么在转换为InputStream后它不是SERIALIZE,如下面的代码所示。 myBO.getAttachedFile()的返回类型是byte []

要检查myBO.getAttachedFile()的序列化,我使用了下面的代码。它不会给出异常

    try {
        new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(myBO.getAttachedFile());
    } catch (Exception e) {
        logger.debug("========EXCEPTION====== Object Not Serialized");
        logger.debug(METHOD_NAME, e);
    }       

当我检查inputStream的序列化时,它在下面的代码中给出了异常

    try {
        new ObjectOutputStream(new ByteArrayOutputStream()).writeObject(inputStream);
    } catch (Exception e) {
        logger.debug("========EXCEPTION====== Object Not Serialized");
        logger.debug(METHOD_NAME, e);
    }       

1 个答案:

答案 0 :(得分:0)

您正在尝试将整个InputStream实例写入ObjectOutputStream,而不是内部引用的实际资源的内容。您只能编写实现Serializable interface的实例,否则您将得到一个相当自我解释的NotSerializableException

InputStream class确实实现Serializable接口。 InputStream实例仅表示指向底层环境中打开的字节资源的指针。与byte[]实例相反,InputStream实例本身不包含您要序列化的任何数据。 InputStream实例仅仅是底层环境(例如磁盘文件系统指针)上的实际字节资源与Java代码之间的“信使”。它能够以byte / byte[]的形式读取数据并将其返回,但它本身并不将它们存储在实例中的任何位置。它没有private byte[] alldata属性。

你真的无法序列化这样的事情。资源会泄漏(因此,当您在太短的时间内执行此操作时,您的环境将耗尽资源)并且指针在您反序列化时不再有效,当然不是在您执行时它处于完全不同的环境中。

只需使用byte[]即可。或者,或许更好,忘记整个序列化尝试。根据具体的功能要求,这很可能对你想要达到的目标没有任何意义。