Изменение поведения XMLEncoder после перехода с Java 1.6.x на 1.7.x - PullRequest
1 голос
/ 12 декабря 2011

Я перекомпилировал часть своего кода под Java 7 и начал тестирование. Довольно скоро я заметил, что механизм, который я использовал для сериализации объектов в xml, перестал работать. К счастью, эта сериализация предназначена для временного хранения сессий, поэтому я мог удалить все старые сериализованные XML-файлы и начать с нуля, используя xstream вместо XMLEncoder.

Мне любопытно, что я сделал неправильно или что изменилось в XMLEncoder, поставляемом с Java7.

B.java:

import java.util.*;
public class B{
        public String s;
        public void setS(String s){
                this.s = s;
        }
        public String getS(){
                return this.s;
        }
        public HashSet<String> h = new HashSet<String>();
        public void setH(HashSet<String> h){
                this.h = h;
        }
        public HashSet<String> getH(){
                return this.h;
        }
}

A.java:

import java.util.*;
import java.io.*;
import java.beans.*;
class A{
        public A(){
                B tmp = new B();
                tmp.setS("abc");
                HashSet<String>h = new HashSet<String>(Arrays.asList("a", "c"));
                tmp.setH(h);

                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                XMLEncoder e = new XMLEncoder( new BufferedOutputStream(bos) );
                e.writeObject( tmp );
                e.close();
                System.out.println(bos.toString());
        }
        public static void main(String []arg){
                new A();
        }
}

Запуск A под Java 1.6.x дает мне:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0_25" class="java.beans.XMLDecoder">
 <object class="B">
  <void property="h">
   <void method="add">
    <string>b</string>
   </void>
   <void method="add">
    <string>a</string>
   </void>
  </void>
  <void property="s">
   <string>abc</string>
  </void>
 </object>
</java>

Запуск A под Java 1.7.0_01 дает мне:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_01" class="java.beans.XMLDecoder">
 <object class="B" id="B0">
  <void class="B" method="getField">
   <string>s</string>
   <void method="set">
    <object idref="B0"/>
    <string>abc</string>
   </void>
  </void>
 </object>
</java>

Как видите, вывод не содержит никаких следов поля HashSet h.

Я немного погуглил, но пока единственный похожий случай, который я смог найти, это этот пост , больше ничего.

Заранее спасибо за подсказки.

1 Ответ

2 голосов
/ 19 декабря 2011

Вам необходимо сделать ваши данные частными в классе B, и это будет работать нормально. попробуйте этот код.

private String s;
private HashSet<String> h = new HashSet<String>();

Вы должны следовать соглашениям Java при определении всех ваших классов. XMLEncode будет использовать методы getter / setter для правильного преобразования объектов в xml.

...