从java 1.6迁移后XMLEncoder的行为变化.X到1.7.x



我已经在Java 7下重新编译了一些代码并开始测试。很快我就注意到,我用来将对象序列化为xml的机制停止工作了。幸运的是,这个序列化是用于临时会话存储的目的,所以我可以删除所有旧的序列化xml,并从头开始使用xstream而不是XMLEncoder。

我很好奇我做错了什么,或者Java7附带的XMLEncoder有什么变化。

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();
        }
}

在java 1.6下运行A。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>

在java 1.7.0_01下运行A给我:

<?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字段的任何跟踪。

我用谷歌搜索了一下,但到目前为止,我能找到的唯一类似的案例是这篇文章,没有别的了。

提前感谢你的提示

你需要让你的数据成员私有类B,它会工作得很好。试试这段代码。

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

在定义所有类时需要遵循java约定。XMLEncode将使用getter/setter方法将对象正确地转换为xml。

相关内容

  • 没有找到相关文章

最新更新