2017-11-18 86 views
0

我有一個私人領域和公共方法的類。我的方法遵循get/set命名約定。當我的字段是私人的,並且我嘗試將我的對象數據寫入XML文件時,我得到一個空的XML文件,但是當我將它們更改爲public時,XML包含所有必需的數據。你認爲這是什麼造成的?XMLEncoder當類字段是私人時不寫對象數據

public class ClassData { 

private String name; 
private ArrayList<String> methods; 

public ClassData() 
{ 
    methods = new ArrayList<>(); 
} 

public void setName(String cName) 
{ 
    name = cName; 
} 

public String getName() 
{ 
    return name; 
} 

public void setMethods(String mName) 
{ 
    methods.add(mName);  
} 

public ArrayList<String> getMethods() 
{ 
    return methods; 
} 

} 

String fileName = cObj.getName() + ".xml"; 

XMLEncoder enc=null; 

try{ 
    enc=new XMLEncoder(new BufferedOutputStream(new FileOutputStream(fileName))); 
}catch(FileNotFoundException fileNotFound){ 
    System.out.println("Unable to save file."); 
} 

enc.writeObject(cObj); 
enc.close(); 
+0

你在說什麼XMLEncoder? – f1sh

+0

@ f1sh更新後的XML代碼。我正在使用java.beans.XMLEncoder – Brosef

回答

0

這是因爲你的方法沒有"Setter",使其可訪問的「屬性」。將方法setMethods(String mName)改爲addMethod(String mName)以添加單獨的方法並添加一個設置器setMethods,它設置的方法和事物的工作時間相同。示例如下:

import java.beans.XMLEncoder; 
import java.io.BufferedOutputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.util.ArrayList; 

public class ClassData { 

    private String name; 
    private ArrayList<String> methods; 

    public ClassData() { 
     methods = new ArrayList<>(); 
    } 

    public void setName(String cName) { 
     name = cName; 
    } 

    public String getName() { 
     return name; 
    } 

    public void addMethod(String mName) { 
     methods.add(mName); 
    } 
    public void setMethods(ArrayList<String> m) 
    { 
     methods.addAll(m); 
    } 

    public ArrayList<String> getMethods() { 
     return methods; 
    } 

    public static void main(String[] args) { 
     ClassData cObj = new ClassData(); 
     cObj.setName("This_is_name"); 
     cObj.addMethod("m1"); 
     String fileName = cObj.getName() + ".xml"; 

     XMLEncoder enc = null; 

     try { 
      enc = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(fileName))); 
     } catch (FileNotFoundException fileNotFound) { 
      System.out.println("Unable to save file."); 
     } 

     enc.writeObject(cObj); 
     enc.close(); 

    } 

} 
+0

我明白你的意思,但爲什麼'public void setMethods(String mName)'不被認爲是一個合適的setter?所以你的方法'public void setMethods(ArrayList m)'永遠不會被調用? – Brosef

+0

@Brosef因爲它不是bean的setter方法。否則,我們甚至可以有方法名稱'sayHello(String m)',它也可以更新屬性。但它不會使方法成爲一個屬性。更多細節在java [bean spec](http://www.oracle.com/technetwork/articles/javaee/spec-136004.html)中有介紹...... 8.3.1節:默認情況下,我們使用設計模式來通過查找表單的方法找到屬性: 'public get ();' 'public void set a)' – Optional