Java将配置类保存到可编辑文件中

时间:2016-03-27 18:57:42

标签: java serialization config

您好我想保存一个包含我的应用程序配置的Java类 例如:

class MyConfig {
 public int a= 0;
 public boolean b= true;
}

我希望用户可以编辑这个文件,初看JSONSerializer对于一个简单的案例就可以了。 但是我想要更多的东西...例如,在未来我想添加/删除我班级的字段......它仍然有用吗? (如果添加了一个字段,我希望在加载包含旧类的文件时使用默认值....)

我不知道我是否清楚...... 但如果我可以添加

public String c= "hello";

然后加载文件(不包含字段c的值)。 谢谢!

编辑: 这就是我想要的:

public class PropertiesSerializer<T> {
    private final Class clDef;
    private T obj;

    public T get(){ return obj; }

    public PropertiesSerializer(Class cl){ //uhm...
        if ( cl == null ) throw new NullPointerException();
        clDef= cl;
    }

    public void init() throws InstantiationException {
        Constructor[] ctors = clDef.getDeclaredConstructors();
        Constructor ctor = null;
        for (int i = 0; i < ctors.length; i++) {
            ctor = ctors[i];
            if (ctor.getGenericParameterTypes().length == 0)
                break;
        }

        ctor.setAccessible(true);
        try {
            obj = (T) ctor.newInstance();
        } catch (IllegalAccessException e) {
            throw new InstantiationException(e.getMessage());
        } catch (InvocationTargetException e) {
            throw new InstantiationException(e.getMessage());
        }
    }

    public void load(String filename) throws IOException, InstantiationException {
        File fl= new File(filename);
        Properties props= new Properties();
        try (FileReader reader= new FileReader(fl)) {
            props.load(reader);
        }

        init();
        for(Field fd: clDef.getFields()){
            try {
                Object valobj= props.getProperty( fd.getName() );
                obj.getClass().getField( fd.getName() ).set( obj, fd.getType().cast(valobj) ); //uhm...
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        }
    }

    public void save(String filename) throws InvalidStateException, IllegalAccessException, IOException {
        if( obj == null ) throw new InvalidStateException("init wasn't called!");

        File fl= new File(filename);
        Properties prop= new Properties();
        for( Field fd: clDef.getFields() ){
            prop.setProperty( fd.getName(), String.valueOf(fd.get(obj)) ); //uhm...
        }

        try( FileWriter writer = new FileWriter(fl) ) {
            prop.store(writer, "PropertiesSerializer");
        }
    }
}

当然我可以保存我的测试类...

public class TestClass implements Serializable {
    public boolean a= true;
    //public int i= 1;
}

但我无法加载它:(失败:

  

线程“main”中的异常java.lang.ClassCastException:无法强制转换   java.lang.String在java.lang.Class.cast中的布尔值(Class.java:3369)     在   net.sf.aldrigo.propertiesSerializer.PropertiesSerializer.load(PropertiesSerializer.java:55)     在   net.sf.aldrigo.propertiesSerializer.MainTest.main(MainTest.java:17)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:497)at   com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

1 个答案:

答案 0 :(得分:0)

查看SimpleXml或只使用java.util.Properties并通过反思滚动自己。