Serializable - Bei Update ältere Daten importieren

Mujahiddin

Top Contributor
Einen guten Tag!
Um nicht abstrakt zu reden, komme ich gleich zur Sache:
Ich programmiere ein 'Vokabelheft', man kann Einträge einfügen, und diese dann speichern über Serializable..
Problem: Wenn ich eine Änderung am Code vornehme, sprich: Ich mach ein Update auf dieses Vokabelheft, müsste man alle Einträge vom alten Vokabelheft per Hand übernehmen, und das will ich vermeiden.
Galileo Computing hat auch nur eine Lösung per XML, aber da treten Fehler auf:

java.lang.InstantiationException: sun.awt.shell.Win32ShellFolder2
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Win32ShellFolder2);
Continuing ...

Der Befehl wird zwar ausgeführt, die Datei ist danach aber leer.

Weiß wer weiter? ...
 

fastjack

Top Contributor
Ich denke mal, Du willst in einen Non-System Folder schreiben, sprich "My Computer", "Desktop" etc. Da gibt es allerdings bei einigen Java-Versionen einen Bug, der diesen Fehler erzeugt. Gibt doch mal einen echten Pfad an, absolut oder relativ.
 

Mujahiddin

Top Contributor
So gesehen gibt er ja einen absoluten Pfad an... Den Pfad nimmt er nämlich über JFileChooser.getCurrentDirectory();, welchen man über selbigen auswählt.
Ich bin dort mit 'Aufwärts' auf den Desktop gegangen und hab in einen Unterordner gespeichert. Lags daran? Wie soll ich das über ein Filechooser denn verhindern?
 
S

SlaterB

Gast
worum gehts überhaupt, um 'Galileo Computing hat [..] eine Lösung per XML'?
wie soll man dazu etwas sagen, poste doch einen Link zum entsprechenden Kapitel,
sowie ein kleines Testprogramm, ohne FileChooser oder GUI, nur mit main-Methode, vorgegebenen Pfad und paar Dummy-Daten zu speichern
 

nrg

Top Contributor
ich hab das auch mal mit dem XMLEn/Decoder ausprobiert und bin auf selbigen Fehler gestossen. Ich weiß nurnoch, dass das für mich damals absolut nicht nachvollziehbar war. Könnte dir jetzt nur eine normale Serialisierung mit dem ObjectOutputStream vorschlagen. Nachteile liegen denke auf der Hand, z.b. Dateien sind nicht im Editor lesbar bzw änderbar (könnte natürlich auch als Vorteil interpretiert werden ;))

Nebenbei dann die Frage, die ich damals schon stellen wollte:
Was ist daran falsch?
Java:
import java.beans.*;
import java.io.*;

public class Test implements Serializable{
	private static final long serialVersionUID = 1L;
	private String s;
	private int i;
	public Test (String s, int i) {
		this.s = s;
		this.i = i;
	}
	public static void main(String[] args) throws FileNotFoundException {
		XMLEncoder xem = new XMLEncoder( new BufferedOutputStream( new FileOutputStream("test.xml")));
		XMLDecoder xde = new XMLDecoder( new BufferedInputStream( new FileInputStream("test.xml")));
		xem.writeObject(new Test("Hallo", 123));
		xem.close();
		Test test = (Test)xde.readObject();
		xde.close();
		System.out.println(test);
	}
	@Override
	public String toString() {
		return s + " " + i;
	}
}

Ergebnis:
Code:
java.lang.InstantiationException: Test
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Test);
Continuing ...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at com.sun.beans.ObjectHandler.dequeueResult(Unknown Source)
	at java.beans.XMLDecoder.readObject(Unknown Source)
	at Test.main(Test.java:17)

edit: also die AIOOBE erklär ich mir, weil die Datei einfach leer ist. Mir gehts eher um die Serialisierung. Warum macht er einfach garnix? :(
 

nrg

Top Contributor
ahja stimmt, man braucht den Stdkonstruktor explizit... aber naja dann serialisier ich null. ich will aber schon die Attribute s und i von meinem Objekt serialisieren. (soweit war ich glaub dann damals auch :))
 
S

SlaterB

Gast
man beachte das magisch 'und' in der Antwort von fastjack ;)
 
Zuletzt bearbeitet von einem Moderator:

Mujahiddin

Top Contributor
Bei mir sieht das so aus:

Java:
static class Vokabelheft
	{
		public static Baum binaerbaum;
		public static void main(String[] args)
		{
			binaerbaum = new Baum();
			binaerbaum.add(new Entry("Kamikaze"));
			binaerbaum.add(new Entry("Fliege"));
			binaerbaum.add(new Entry("Test"));
			binaerbaum.add(new Entry("Katze"));
			binaerbaum.add(new Entry("Hund"));
			binaerbaum.add(new Entry("Roflz0r"));
			File file = new File("C:/TEST.xml");
			XMLEncoder enc = null;
			OutputStream fos = null;
			try
			{
				fos = new FileOutputStream(file);
				enc = new XMLEncoder(fos);
				enc.writeObject(binaerbaum);
				enc.close();
			}
			catch(IOException e)
			{
				e.printStackTrace();
			}
		}
	}
wenn ich jetzt TEST.xml öffne, finde ich nur ein <Baum> als object, keine unterobjekte (entry / Knoten etc)
ansonsten, per FileChooser etc. kommt wie üblich der oben genannte Fehler...

P.S. hier der Galileo Computing Link:

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 14.12 Persistente Objekte und Serialisierung


// was sind beanskonforme Getter / Setter Methoden?
Und wie soll ich parameterlose Konstruktoren machen? Du meinst damit ohne 'public', oder? Aber dann könnte ich von außen nicht mehr drauf zugreifen!
 
S

SlaterB

Gast
parameterlos heißt ohne Parameter, nicht ohne Sichtbarkeits-Modifer

und ne intern versteckte Liste mit mehreren Unterelementen wird schwer, das entspricht ja auch nicht den 'beanskonforme Getter / Setter Methoden', wie du selber schon zitierst, diese beiden Punkte müssen erfüllt sein,
evtl. gehts, wenn eine normale ArrayList als ein Attribut gehalten wird, die ArrayList lässt sich ja zumindest serialisieren (dank manueller Unterstützungsmethoden), dann unterstützt es vielleicht auch XML
 

Mujahiddin

Top Contributor
Also sprich: Die einzige Methode, einen solchen Baum XML-serialisierbar zu machen, ist, dass ich alle Unterelemente praktisch als Strings oder sonstiges abspeicher?
 
S

SlaterB

Gast
nicht einzig, aber ja, das wäre ein guter einfacher Weg,
neben String & Co. (edit: und anderen eigenen Objekten die ähnlich einfach aufgebaut sind )
evtl. auch ArrayList, denn die ist ja auch serialisierbar,

oder als Alternative:
du verwendest die Hilfsmethoden wie es ArrayList selber auch macht:

Java:
    /**
     * Save the state of the <tt>ArrayList</tt> instance to a stream (that
     * is, serialize it).
     *
     * @serialData The length of the array backing the <tt>ArrayList</tt>
     *             instance is emitted (int), followed by all of its elements
     *             (each an <tt>Object</tt>) in the proper order.
     */
    private void writeObject(java.io.ObjectOutputStream s)
        throws java.io.IOException{
	// Write out element count, and any hidden stuff
	int expectedModCount = modCount;
	s.defaultWriteObject();

        // Write out array length
        s.writeInt(elementData.length);

	// Write out all elements in the proper order.
	for (int i=0; i<size; i++)
            s.writeObject(elementData[i]);

	if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
        }

    }

    /**
     * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is,
     * deserialize it).
     */
    private void readObject(java.io.ObjectInputStream s)
        throws java.io.IOException, ClassNotFoundException {
	// Read in size, and any hidden stuff
	s.defaultReadObject();

        // Read in array length and allocate array
        int arrayLength = s.readInt();
        Object[] a = elementData = new Object[arrayLength];

	// Read in all elements in the proper order.
	for (int i=0; i<size; i++)
            a[i] = s.readObject();
    }
damit verläßt man den automatischen Bean-Standard zumindest teilweise
und kann durch manuellen Code die Serialisierung etwas genauer steuern


-----

ob das bei XML auch reicht, vermute ich wie gesagt die ganze Zeit nur, nicht getestet,
einfach mal eine ArrayList nach XML schicken, aber kann ich auch selber machen:
Java:
        XMLEncoder xem = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("test.xml")));
        ArrayList a = new ArrayList();
        a.add("test");
        a.add(Boolean.TRUE);
        xem.writeObject(a);
        xem.close();
->
Code:
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0_13" class="java.beans.XMLDecoder"> 
 <object class="java.util.ArrayList"> 
  <void method="add"> 
   <string>test</string> 
  </void> 
  <void method="add"> 
   <boolean>true</boolean> 
  </void> 
 </object> 
</java>
hmm, wo das wohl herkommt?
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Eine Frage zu Serializable Java Basics - Anfänger-Themen 3
O Serializable Java Basics - Anfänger-Themen 3
B Input/Output Serializable / writeObject(..) nur Sonderfälle? Java Basics - Anfänger-Themen 8
B Properties oder Serializable Java Basics - Anfänger-Themen 3
C Kompilier-Problem mit "Serializable" Java Basics - Anfänger-Themen 2
J Sicherungskopie mit Serializable. Wie? Java Basics - Anfänger-Themen 2
P Java Serializable auf dem FTP Java Basics - Anfänger-Themen 7
A veränderbar kanonische Klassen: Methode equals, hashcode, serializable Java Basics - Anfänger-Themen 5
M The serializable class . does not declare a static . Java Basics - Anfänger-Themen 2
G The serializable class Kalender does not declare a static fi Java Basics - Anfänger-Themen 5
N The serializable class.does not declare a static final . Java Basics - Anfänger-Themen 2
P Serializable - Serialisierung Java Basics - Anfänger-Themen 5
G Serializable Java Basics - Anfänger-Themen 6
K Serializable Java Basics - Anfänger-Themen 7
R "implements Serializable" Fehler beim kompilieren Java Basics - Anfänger-Themen 2
Mugetsu35 ArrayList Update ohne Index Java Basics - Anfänger-Themen 6
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
G Konstruktor und update Java Basics - Anfänger-Themen 4
Henri Webservice Delete und Update Methode funktioniert nicht Java Basics - Anfänger-Themen 27
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
S Lost-Update Semaphore Java Basics - Anfänger-Themen 6
K Schlüsselworte Nach Java update findet mdb Datei nicht Java Basics - Anfänger-Themen 6
M Methodenaufruf über SQL UPDATE Java Basics - Anfänger-Themen 8
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
J fehler nach windows update Java Basics - Anfänger-Themen 44
Y Observer update Java Basics - Anfänger-Themen 3
G Threads Konstantes Update Java Basics - Anfänger-Themen 1
X Eventservice Probleme nach Update Java Basics - Anfänger-Themen 0
B VAriables update in for-Schelifen Java Basics - Anfänger-Themen 3
L Jar aus Jar Starten lassen (Update Tool) Java Basics - Anfänger-Themen 6
P Update System Java Basics - Anfänger-Themen 16
R Nach Ubuntu-Update: Konsole spuckt bei neu Kompilierten Programmen Fehler aus (BlueJ)(Ubuntu12.04) Java Basics - Anfänger-Themen 11
L Auf herunterfahren des PCs reagieren und Datensatz update machen Java Basics - Anfänger-Themen 15
K Threads jProgressBar update Java Basics - Anfänger-Themen 14
Gugelhupf JDK installieren Fehlermeldung 1336 - Java SDK 7 Update 5 x64 Java Basics - Anfänger-Themen 4
A JDK installieren Java update - neu installieren? Java Basics - Anfänger-Themen 7
R JDK installieren Nach Update auf java 1.7 Connection refused Java Basics - Anfänger-Themen 9
E Programm - Update via Internet? Java Basics - Anfänger-Themen 5
B JDK installieren Java SE Development Kit 6 Update 25 Java Basics - Anfänger-Themen 5
M Update-Ticker... String in Textdatei schreiben und auslesen Java Basics - Anfänger-Themen 5
S MVC Prinzip - update() ? Java Basics - Anfänger-Themen 2
B Problem mit prepareStatement UPDATE Java Basics - Anfänger-Themen 2
C JAVA - Einstieg mit Eclipse - Update Sites und Ähnliches Java Basics - Anfänger-Themen 6
S JTree, Problem mit View Update Java Basics - Anfänger-Themen 2
L Java Persistence API - Update Befehl? Java Basics - Anfänger-Themen 5
hdi Fehler beim Model-Update einer JList (DefaultListModel) Java Basics - Anfänger-Themen 3
A update/draw schleife Java Basics - Anfänger-Themen 5
S update wird nicht aufgerufen Java Basics - Anfänger-Themen 9
G JFreeChart und das Update(was nicht klappt). Java Basics - Anfänger-Themen 3
A label update Java Basics - Anfänger-Themen 10
Y JDK 6 Update 5 with Java EE? Java Basics - Anfänger-Themen 2
M Java SQL-Update Java Basics - Anfänger-Themen 6
A per "update" ein Bild Strich für Strich "male Java Basics - Anfänger-Themen 9
S Ein Update System programmieren Java Basics - Anfänger-Themen 27
P Zeichenprogramm-->update() aushebeln Java Basics - Anfänger-Themen 11
S SQL UPDATE in Java "wie schreiben"? Java Basics - Anfänger-Themen 6
E Update JList Java Basics - Anfänger-Themen 13
J Problem bei Update auf Datenbank Java Basics - Anfänger-Themen 2
K Observer Observable update() . Java Basics - Anfänger-Themen 13
R JRE 1.5.0 Update 7 Install erkennt nicht Firefox/Netscape Java Basics - Anfänger-Themen 3
M [SOLVED]update() bei MVC Java Basics - Anfänger-Themen 4
M Datenbankabfrage mit UPDATE Java Basics - Anfänger-Themen 4
M Unterschied zwischen J2SE 5.0 Update x und J2SE 1.4.x Java Basics - Anfänger-Themen 4
N Array aus JCheckBox? 1000 if's UPDATE: Spaltennamen auslesen Java Basics - Anfänger-Themen 12
G Update auf Datenbankspalte vom Typ Timestamp mit aktu. Datum Java Basics - Anfänger-Themen 3
G Observable/Observer update wird nicht ausgeführt Java Basics - Anfänger-Themen 9
A Eclipse IDE - Wie bekomme ich eine ältere Version Java Basics - Anfänger-Themen 6
B ältere Dateien verschieben Java Basics - Anfänger-Themen 3
J Plattformunabhängigkeitstest fehlgeschlagen! Für ältere JRE kompilieren? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben