2013-10-16 8 views
0

Недавно я обновился до Java 7, и я замечаю странную проблему с сериализацией XML. В принципе, у меня есть класс утилиты тестирования, который преобразует объект в XML с помощью кодировщика XML.Java IOException на XMLEncoder flush

См пример кода ниже:

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 Java. Я не видел эту проблему с кодировщиком XML или с помощью этого метода в целом, есть ли что-то, что я могу исправить в коде, или это кажется более нисходящим? Что мне не хватает?

ответ

0

Наконец-то я смог понять это. Проблема состояла в том, что Java от 6 до 7 upgradearde.

Diff betweem Java 6 и 7, XMLEncoder показывает, что в Java 6 кодер XML работает непосредственно на ByteArrayOutputStream передается в конструктор, тогда как в Java 7, XMLEncoder обертывания StreamEncoder вокруг ByteArrayOutputStream передается в конструктор.

(линия 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) абсолютно ничего не делает, StreamEncoder.close() (см Javadoc) бросает возмещаемой IOException, если поток уже закрыто.

Это исключение подбирается по умолчанию ExceptionListener и регистрируется в журналах.