XMLEncoder flush上的Java IOException

时间:2013-10-16 00:51:48

标签: java-7 ioexception xmlencoder

我最近升级到Java 7,我注意到XML序列化的一个奇怪问题。基本上,我有一个测试实用程序类,它使用XML编码器进行Object to XML转换。

请参阅以下示例代码:

public static String toXML(Object obj) {
    String retval = null;

    if(obj != null) {
        XMLEncoder encoder = null;
        ByteArrayOutputStream bos;

        try {
            bos = new ByteArrayOutputStream();
            encoder = new XMLEncoder(bos);
            encoder.writeObject(obj);
            encoder.close();
            byte[] bytes = bos.toByteArray();
            if(bytes != null) {
                retval = new String(bytes);
            }

        } catch(Exception e) {
            e.printStackTrace();

        } finally {
            if(encoder != null) {
                encoder.close();
            }
        }
    }
    return retval;
}

在Java 1.6中运行良好,但是自从我升级到Java 1.7以来,我注意到XML编码器操作在日志中抛出了IOException:

java.io.IOException: Stream closed
at sun.nio.cs.StreamEncoder.ensureOpen(StreamEncoder.java:45)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:140)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.beans.XMLEncoder.flush(XMLEncoder.java:497)
at java.beans.XMLEncoder.close(XMLEncoder.java:530)
at com.mytestcode.server.common.util.TestSerializer.toXML(TestSerializer.java:87)

我查看了XMLEncoder代码,发现StreamEncoder.ensureOpen检查了isOpen,这似乎是假的。

This问题看起来很相似,尽管它没有使用Java 1.7 XML编码器。我没有看到XML编码器的这个问题,或者通常使用这种方法,是否有一些我可以在代码中修复或者这看起来更下游?我错过了什么?

1 个答案:

答案 0 :(得分:0)

我终于能够把这个想出来了。麻烦是因为Java 6到7 upgarde。

Diff在Java 6和7之间,XMLEncoder显示在Java 6中,XML编码器直接在构造函数中传递的ByteArrayOutputStream上工作, 而在Java 7中,XMLEncoder围绕在构造函数中传递的ByteArrayOutputStream包装StreamEncoder。

(第289行)

http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/beans/XMLEncoder.java/?v=diff&id2=6-b14

调用ByteArrayOutputStream.close()(请参阅Javadoc)时,如果Stream已经关闭,则StreamEncoder.close()(请参阅Javadoc)会抛出可恢复的IOException。

此异常被选中默认的ExceptionListener并记录在日志中。

相关问题