Objekt Serialisierung: Schreiben aller Attribute erzwingen

Status
Nicht offen für weitere Antworten.

Lord eAgle

Mitglied
Hallo Forum

Ich versuche hier gerade eine Klasse mit dem java.beans.XMLEncoder als XML Datei zu speichern. Der Code dazu sieht ungefähr so aus wie in diesem Tutorial: Lesson: Long Term Persistence (The Java™ Tutorials > JavaBeans(TM))
Mir ist mir aufgefallen, dass nur die Attribute in das XML-File geschrieben werden, die zur Laufzeit verändert worden sind.

Nun möchte ich aber erzwingen, dass auch die Attribute der Klasse, die noch den Wert der Default-Instanzierung enthalten, serialisiert werden.

Gibt es da einen eleganten weg?
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Nun möchte ich aber erzwingen, dass auch die Attribute der Klasse, die noch den Wert der Default-Instanzierung enthalten, serialisiert werden.
Gibt es da einen eleganten weg?
Wir können einen eigenen PersistenceDelegate setzen. Im folgenden Beispiel wird die Serialisierung des Attributs "Sex" einer Klasse "Person" erzwungen:
Java:
private List<Person> personsList;
...
encoder.setPersistenceDelegate(Person.class, new PersonPersistenceDelegate());
encoder.writeObject(personsList);
...
class PersonPersistenceDelegate extends DefaultPersistenceDelegate {
    @Override
    protected void initialize(Class type, Object oldInstance,
            Object newInstance, Encoder out) {
        super.initialize(type, oldInstance, newInstance, out);
        Person p = (Person) oldInstance;
        int sex = p.getSex();
        if(sex == 0){//0 = default Wert
            out.writeStatement(new Statement(oldInstance, "setSex", new Object[]{sex}));
        }
    }
}
Siehe auch: Using XMLEncoder
 
Zuletzt bearbeitet:

Lord eAgle

Mitglied
Wir können einen eigenen PersistenceDelegate setzen.
Okay ich habe das jetzt mal implementiert, danke für den Tipp. Durch diesen Delegate kann ich jetzt Beispielsweise boolean Attribute in eine XML-Datei schreiben, wenn sie auf "false" gesetzt sind. Dies ist Default-mässig nicht möglich. Ich nehme mal an das liegt daran, dass der Wert "false" dem Initialisierungszustand von boolean entspricht.
Java:
public class SettingsPersistenceDelegate extends DefaultPersistenceDelegate {
	@Override
	protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder out) {
		super.initialize(type, oldInstance, newInstance, out);
		forceWritingOfBooleanFields(oldInstance, out);
	}
	
	private void forceWritingOfBooleanFields(Object instance, Encoder out){
		Method[] methods = instance.getClass().getDeclaredMethods();
		for(Method method : methods){
			String methodName = method.getName();
			if (method.getReturnType() == boolean.class){
				try {
					if ((Boolean) method.invoke(instance) == false){
						String setterMethodName = methodName.replaceFirst("is", "set");
						out.writeStatement(new Statement(instance, setterMethodName, new Object[]{false}));
					}
				} catch (Exception e) {
					e.printStackTrace();
				} 
			}
		}
	}
	
}

Folgende Problem sehe ich dabei:
  1. Ich wollte das Problem eigentlich abstrakt lösen, so dass ich den Code für weitere Klassen wiederverwenden kann. Nur setzt mein Code zwingend voraus, dass für ein Attribut auch getter und setter vorhanden sind, die den java styleguide entsprechen. Also Methoden die mit "is..." und "set..." anfangen und als Accessor dienen.
  2. Ein weiteres Problem, wenn ich meine Klasse mit JavaBean serialisiere schaffe ich es nicht, einen Singleton in dieser Klasse sauber zu implementieren. Sobald ich den Konstruktor der Klasse nicht "public" mache, verweigert der Serialisier die Arbeit.
    Code:
    java.lang.IllegalAccessException: Class sun.reflect.misc.Trampoline can not access a member of class xmltomce.settings.Settings with modifiers "private"

Was ich eigentlich erstellen wollte war ein Klasse, die ich als Konfigurationsdatei benutzen kann. Also alle wichtigen globalen Einstellungen, die ohne neu kompilieren verändert werden sollen, werden in dieser Klasse abgelegt und können zur Not in der XML-Datei verändert werden. Nur finde ich diese Lösung nicht optimal, der Ersteller der Konfig-Klasse muss viel über diese wissen, um sie zu benutzen (zu viel):
  1. Der Konstruktor darf von anderen Klassen nicht verwendet werden obwohl dieser Public ist. Das Laden aus der XML-Datei funktioniert nur wenn die "getInstance()" Methode verwendet wird.
  2. Attribute die in der XML-Datei stehen sollen, müssen im Konstruktor innerhalb der NULL-Abfrage erstellt werden, damit sie als Änderung zum Initialzustand erkannt werden.
    Java:
    protected Settings(){
    		if (SETTINGS == null){ // Setting werden nicht als Default-Werte erkannt -> write 2 XML
    			officeBinPath = "C:\\Programme\\Office2000\\Office\\";
    			defaultFloorFilter = "Alle";
    			floorFilterDisabled = false;
    			resetFormDelayInSeconds = 5;
    			closeButtonDisabled = true;
    			dvdVobFolderPath = System.getProperty("user.home");
    		}
    	}

Langer Text kurzer Sinn, hat jemand Lust meinen Code zu reviewen und Verbesserungsvorschläge für meine Config-Klasse zu machen? Ich finde die jetztige Lösung unschön und möchte die Benutzung vereinachen, aber mir gehen die Ideen aus. Den Code habe ich im Anhang als ZIP-Datei.

Oder hat jemand eine fertige elegante Lösung für das Problem schon ausprogrammiert? Eigentlich nehme ich an, dass viele andere Projekte auch solche Config-Klassen serialiseren. Wie löst ihr das?

Gruss Lordi
 
Zuletzt bearbeitet:
M

maki

Gast
Fertige Config Klassen gibt es von Spring, Jakarta, etc. pp., aber Java an sich versteht auch Property Dateien und sogar Preferences ;)
 

André Uhres

Top Contributor
..und können zur Not in der XML-Datei verändert werden..
Dafür ist XMLEncoder nicht vorgesehen. Er benutzt eine interne Darstellung, daher auch die Optimierungen, von denen der Benutzer eigentlich nichts mitbekommt. Die Darstellung ist unabhängig von der verwendeten Java Version ist. Von einer manuellen Manipulation der Datei ist jedoch dringend abzuraten!
Mit der denkbar einfachen Voraussetzung der Bean Konvention hatte ich nie Probleme (public Klasse mit Defaultkonstruktor und Getter/Setter für die Attribute, wobei letzteres mit einer guten IDE sogar automatisch erstellt werden kann).
 

Lord eAgle

Mitglied
Fertige Config Klassen gibt es von Spring, Jakarta, etc. pp., aber Java an sich versteht auch Property Dateien und sogar Preferences ;)
hmm die Preferences find ich nicht gerade praktisch. Ich bevorzuge eine Möglichkeit, die rasch eine Übersicht über die möglichen Einstellmöglichkeiten bietet. Das sehe ich in der Registry nicht wirklich gegeben. Da muss man erst noch drauf kommen, dass von dort Daten geladen werden.
Mit den Property Dateien kenn ich mich noch nicht so aus. Werde mich mal schlau machen ...

Mit der denkbar einfachen Voraussetzung der Bean Konvention hatte ich nie Probleme (public Klasse mit Defaultkonstruktor und Getter/Setter für die Attribute, wobei letzteres mit einer guten IDE sogar automatisch erstellt werden kann).
Okay von diesen Konventionen wusste ich nichts. Hätte ich mich wohl besser vorab informiert anstatt mit diversen Testläufen auf diese Erkenntnis zu kommen. :rtfm:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Json Objekt sinnvoll plätten? XML & JSON 1
I ID von Referenz speichern, nicht ganzes Objekt XML & JSON 1
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
M Großes Json Objekt benutzen XML & JSON 5
B Wie kann man das ecncoding in einem vorhandenen Document-Objekt ändern? XML & JSON 2
Q XML-File als Objekt in Java XML & JSON 6
Q Konvertierung von json zum Java Objekt nach vorgegebenem Schema XML & JSON 3
N XStream ConversionException beim Deserialisieren in (Hibernate)Objekt XML & JSON 6
Spin XML - Objekt hinzufügen XML & JSON 3
F Objekt-Generator aus XML und XSD XML & JSON 9
M Objekt mit DOM serialisieren XML & JSON 6
F Marshaling eines JAXB Objektes worin ein anderes JAXB Objekt eingeschlossen ist XML & JSON 6
G PDF (iText) mit Objekt weiterarbeiten XML & JSON 10
M XML-Datum als Referenz auf Objekt-Variable auslesen XML & JSON 5
M Xlink in Java-Objekt umwandeln XML & JSON 9
J File objekt in xml speichern? XML & JSON 12
M XML Encoder Objekt speichern, obwohl BufferedImage im Objekt XML & JSON 3
G Jackson JSON: Dynamische Serialisierung XML & JSON 6
S XML-Serialisierung klappt nicht XML & JSON 5
C Serialisierung mit JAXB XML & JSON 6
E EMF Serialisierung XML XML & JSON 7
F beste lib für xml serialisierung - deserialisierung XML & JSON 4
S XML-Serialisierung beeinflussen XML & JSON 5
G Serialisierung / Deserialisierung von XML mittels EMF XML & JSON 5
D Int-Werte in XML-Datei schreiben (DOM) XML & JSON 2
W XPath schreiben XML & JSON 1
N Java XML schreiben funktioniert nicht XML & JSON 1
L Mit Hilfe von POI eine Tabelle ohne Rahmen in Word schreiben XML & JSON 2
J XML als stream schreiben? XML & JSON 2
M JAXB: automatisches Groß schreiben Property XML & JSON 9
L Datenstruktur in XML-File schreiben XML & JSON 2
G DXF-File schreiben XML & JSON 17
P Komfortabel XML Dokumente schreiben und lesen XML & JSON 6
Maxim6394 Lesen/Schreiben von XML Datei XML & JSON 9
B Validierung nur beim einlesen oder auch beim schreiben? XML & JSON 4
S XML lesen und schreiben XML & JSON 2
C DOM: Attribute nicht in alphabetischer Reihenfolge schreiben XML & JSON 3
T Schreiben einer XML XML & JSON 8
J wert IN einem tag einlesen/schreiben XML & JSON 4
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
K '&' in xml schreiben XML & JSON 2
G Problem beim schreiben von XML in eine File XML & JSON 2
sylo DOM Document in XML Datei schreiben XML & JSON 5
J xmlencoder Zustände einer Bean schreiben XML & JSON 3
B eigentlich einfach nur XML schreiben XML & JSON 3
A JDOM: Wert schreiben bzw. ändern XML & JSON 6
M DOM, Werte mit setAttribute in XML schreiben XML & JSON 3
B XML einlesen und in Datenbank schreiben XML & JSON 1
D Tabs/Einrückungen der XML-Elemente gehen beim Schreiben verloren XML & JSON 5
J XML lesen schreiben XML & JSON 7
T Xml lesen und in .txt zeilenweise schreiben XML & JSON 4
J XML - schreiben und einlesen (Schema) XML & JSON 14
L Einfaches XML Lesen und Schreiben XML & JSON 4
O OpenDocument-Tabelle mit Java lesen und schreiben XML & JSON 3
G Wie Attribute aus XML in ein Model schreiben (StAX)? XML & JSON 7
K XML-schreiben aus ResultSet dauert zu lange XML & JSON 10
G Mit JAXP in eine Datei schreiben XML & JSON 2
R XML-Datei schreiben - InstantiationException XML & JSON 2
Z DOM: Attribute in Knoten schreiben XML & JSON 2
S XMl Dateien in Java schreiben XML & JSON 4

Ähnliche Java Themen

Neue Themen


Oben