2011-12-12 494 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