XMLEncoder当类字段是私人时不写对象数据

XMLEncoder当类字段是私人时不写对象数据

问题描述:

我有一个私人领域和公共方法的类。我的方法遵循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

这是因为你的方法没有"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