【问题标题】:XMLEncoder not writing object data when class fields are private当类字段为私有时,XMLEncoder 不写入对象数据
【发布时间】:2017-11-18 02:08:13
【问题描述】:

我有一个包含私有字段和公共方法的类。我的方法遵循 get/set 命名约定。当我的字段是私有的并且我尝试将我的对象数据写入 XML 文件时,我得到一个空的 XML 文件,但是当我将它们更改为公共时,XML 包含所有必要的数据。您认为这是什么原因造成的?

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

【问题讨论】:

  • 你在说什么 XMLEncoder?
  • @f1sh 使用 XML 代码更新了帖子。我正在使用 java.beans.XMLEncoder

标签: java xml xmlencoder


【解决方案1】:

这是因为您的方法没有 "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();

    }

}

【讨论】:

  • 我明白你在说什么,但为什么public void setMethods(String mName) 不被认为是合适的二传手?所以你的方法public void setMethods(ArrayList&lt;String&gt; m) 永远不会被调用?
  • @Brosef 因为它不是bean的setter方法。否则我们甚至可以拥有方法名称sayHello(String m),它也可以更新属性。但它不会使方法成为属性。更多细节在 java bean spec... Section 8.3.1 :: 默认情况下,我们使用设计模式通过查找以下形式的方法来定位属性:public &lt;PropertyType&gt; get&lt;PropertyName&gt;();public void set&lt;PropertyName&gt;(&lt;PropertyType&gt; a)
猜你喜欢
  • 2013-12-27
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2017-10-29
  • 2020-10-25
  • 1970-01-01
  • 2014-06-19
  • 2021-08-10
相关资源
最近更新 更多