2011-12-12 55 views
1

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

我很好奇,我做了什么错了还是什么在随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:下的Java 1.6.x的

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

磨合给我:

<?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给我:

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

我做了一些google搜索,但到目前为止,我能找到的唯一类似的例子是this post,没有别的。

在此先感谢您的提示。

回答

2

你需要让你的数据成员在B类私有,它会正常工作。试试这个代码。

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

您需要遵循java惯例来定义所有的类。 XMLEncode将使用getter/setter方法将对象正确地转换为xml。

+0

非常感谢,确实做了一个技巧。 – pQd