2016-03-27 18 views
-1

Merhaba benim app örneğin bazı yapılandırmasını içeren bir Java sınıfı kaydetmek istiyorum:Java düzenlenebilir bir dosya içine bir yapılandırma sınıfı kaydetmek

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

Ve ben, bu dosya kullanıcı tarafından düzenlenebilir olmasını istediğiniz İlk bakış JSONSerializer basit bir durum için tamam olabilir. Ama daha fazla bir şey istiyorum ... örneğin geleceğimde sınıfımdan alan eklemek/kaldırmak istiyorum ... ve hala işe yarıyor mu? (Bir alan eklenirse, eski sınıfı içeren dosyayı yüklediğinizde varsayılan değere sahip olmak istiyorum ....)

Net olduğumu bilmiyorum ... örneğin

public String c= "hello"; 

ekleyebilir ve ardından dosyayı (c alanı için bir değer içermeyen) yükleyebilirim. Teşekkür ederiz!

DÜZENLEME

: bu bi'şey çalışıyor budur:
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"); 
     } 
    } 
} 

ve tabii ki benim test sınıfını kaydedebilirsiniz

...

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

ama bunu yükleyemez :(hatası: iplik "ana" java.lang.ClassCastException içinde

İstisna: jav de boolean java.lang.String döküm olamaz net.sf.aldrigo.propertiesSerializer.MainTest.main de a.lang.Class.cast net.sf.aldrigo.propertiesSerializer.PropertiesSerializer.load (PropertiesSerializer.java:55) 'den (Class.java:3369) ( sun.reflect.DelegatingMethodAccessorImpl.invoke de sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62 de sun.reflect.NativeMethodAccessorImpl.invoke0 (Ana Yöntemi)) (DelegatingMethodAccessorImpl.java de MainTest.java:17) : 43) com.intellij.rt.execution.application.AppMain.main de java.lang.reflect.Method.invoke (Method.java:497) en (AppMain.java:144)

+1

Peki, şu ana kadar ne denediniz? –

+0

[java.util.Properties] dosyasına bakın (https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html) ve 'storeToXML()'. – markspace

+0

İstediğinizi yapabilirsiniz, ancak çalışma zamanında sınıfı derlemek için her zaman ve çok iyi bir fikir değil, arama formu java sınıfını çalışma zamanında derleyin –

cevap

0

Ya da SimpleXml'a bakın veya sadece java.util.Properties kullanın ve Reflection ile kendi yuvarlayın.

+0

'java.util.Properties kullanın ve Reflection' yoluyla kendi rulo rulo denedim ... kodumu oku .. ama iş alamıyorum, ve her seferinde yapmaktan hoşlanmıyorum ... ya da foreach sınıfını yazmam ... çözümüm evrensel olmak istiyordu ... Ancak ben SimpleXml'e bir göz atacağım. – Raffa505

+0

Reflection'a derinlemesine bakarsanız, bir kere yazdıktan sonra "her sınıf için" yazmanız gerekmemelidir. jenerik kullanıyorsa. Ama yine de SimpleXML'i tavsiye ederim. C# içinde sunulan aynı XML serileştirme kolaylığı sağlar. Büyük bir kazanç.Tek yapmanız gereken, modelinize daha sonra ek alanlar eklerseniz, seri hale getirilip işaretlenmeyeceğini işaretlemek için uygun etiketi eklemeniz gerekir. Ancak, adından da anlaşılacağı gibi, bu "basit" :) – ManoDestra

İlgili konular