Vector serialisieren: StackOverflow

Status
Nicht offen für weitere Antworten.

Isaac

Bekanntes Mitglied
Moin,
ich habe hier einen Generator der aus einem XML Schema Java Klassen erzeugt. Seit langem wollte ich um diesen Kommandozeilengenerator endlich mal ne GUI stricken. Gesagt getan hab ich das dann auch gemacht.

Der Generator selber ist zweigeteilt. Er sammelt Imformationen aus dem Schema in einen Vector und erzeugt dann aus dem Vector im Moment nur Java Klassen (C Klassen sind geplant). Die eigentliche Zeit geht beim Sammeln der Informationen drauf da das XML Schema 1,2MB gross ist und sehr viele Vergleiche, Schleifen etc durchlaufen werden. Ich dachte mir also, es sei vieleicht eine gute Idee wenn man diesen Vector einfach serialisiert um ihn dann beim nächsten Programmstart einfach einlesen zu können und sich so die Zeit zum Parsen zu sparen. Ich habe also einfach erstmal überall wo benötigt das Serializeable interface implementiert und dann einen Thread gestartet der den Vector innerhalb der GUI rausschreibt..

Erst hab ich es nur mit newThread() versucht was mir eine StackoverflowException eingebracht hat. Aber auch den Stack zu erhöhen brachte keinen Erfolg (siehe unten, im Moment irgendwas bei 14MB wenn der Parameter denn Bytes sind)

Hat jemand nen Tip für mich wie ich meinen Vector raus bekomme? Der ist recht gross, in dem Vector werden alle Paramter für knapp 500 Klassen gehalten.

Gruss,
Isa

Edit: Der gesammte Stacktrace ist sicher 6 Seiten lang

Code:
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == menuItem_serializeData)
        {
            new Thread(null, null, "Thread-" + Thread.activeCount() + 1, 15242880)
            {
                
                public void run()
                {
                    try
                    {
                        Vector v = getComplexTypeList().getListButtonPanel().getVCore();
                        ObjectOutputStream objOut = new ObjectOutputStream(
                                                                           new BufferedOutputStream(
                                                                                  new FileOutputStream("C:/test.ser")));
                        objOut.writeObject(v); 
                        objOut.close();
                    }
                    catch (FileNotFoundException fnfe)
                    {
                        fnfe.printStackTrace();
                    }
                    catch (IOException ioe)
                    {
                        ioe.printStackTrace();
                    }
                }
            }.start();
        }
    }

Code:
java.lang.StackOverflowError
	at java.io.ObjectOutputStream$BlockDataOutputStream.write(ObjectOutputStream.java:1601)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1323)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:367)
	at org.apache.xerces.dom.NodeImpl.writeObject(NodeImpl.java:2026)
	at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:795)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1294)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
 
mhm - ich glaube Heap size erhoehen hilft nur bedingt wenn ueberhaupt.... der error wird geworfen, wenn die rekursionstiefe einer Anwendung zu tief ist.
wie sind denn deine Objekte im Vector organisiert ? sind die atomar oder auch wieder mit unterobjekten die womoeglich verkettet sind oder so ?

Ich wuesste momentan aber leider keine andere moeglichkeit als versuchen nicht den vektor sondern die objekte zu serialisieren ?!

habe ich noch nicht gemacht, aber vielleicht hilft dir mehr http://java.sun.com/j2se/1.4.2/docs/api/java/io/Externalizable.html weiter ?![/code]
 
Der Vector ist recht fett, naja eignetlich ist er Megafett. Dort sind wirklich alle Informationen wieder in Objekten organisiert wie man sie auch im Schema des XMLs findet. Das macht es einfacher danach die Informationen zu verwalten wenn die Klassen erzeugt werden.

Danke für den Link, Externalizable kannte ich noch garnicht. Schau ich mir gleich mal an.
 
Hätte da ne Frage am Rande!


Ist es in Java nicht möglich einfach Objekte abzuspeichern ohne sie zu serialisieren, so wie in C mit FWrite und Fread
??

Gibts denn sowas, weil mich fuckt das serialisieren in dem java an! Bisher der größte Nachteil der mir aufgefallen ist!
 
thE_29 hat gesagt.:
Hätte da ne Frage am Rande!
Ist es in Java nicht möglich einfach Objekte abzuspeichern ohne sie zu serialisieren, so wie in C mit FWrite und Fread
??Gibts denn sowas, weil mich fuckt das serialisieren in dem java an! Bisher der größte Nachteil der mir aufgefallen ist!
Nein ist es nicht !
ausserdem - in 9 von 10 faellen reicht ein einfaches implements Serializable aus - was ist daran ein Nachteil ?
 
das ich in allen Programmen das jetzt nachziehen kann, nur weil ich 1 Objekt abspeichern will!

Das ist der Nachteil! Warum muss es implements serializable sein?

Wenn es nicht einfach reicht die dumme Struktur abzuspeichern, sowas ärgerliches
 
thE_29 hat gesagt.:
Wenn es nicht einfach reicht die dumme Struktur abzuspeichern, sowas ärgerliches
mhm - ich weiss nicht genau wie c das speichern handhabt - aber in java ist das ebenso... schau dir mal die Methode writeObject bzw. readObject in den Klassen ObjectOutputStream bzw. ObjectInputStream an.... es geht nun einfach nicht einfach so mal kurz abspeichern.....

nimms oder lass es sein
 
Kann es sein, dass Dein XML-Schema Zyklen hat?
In den Fall schreibt sich das ObjectOutputStream 'nen Wolf.

z.B. zwei Objekte A und B

A werweist auf B
B werweist auf A

Keins davon ist transient oder static.
Folge: Endlosschleife -> StackOverflow.
 
Ja daran hab ich auch schon gedacht. Aber ich weiss es nicht. Der Vector ist auch einfach zu gross um mal eben reinzuschauen. Der Generator an sich ist schon 2 Jahre alt. Ich werde aber mal schauen ob ich das irgendwie glatt gezogen bekommen.


Heute lief eh alles schief, ich hatte noch so viel platz im GUI und dachte ich zeige das Schema gleich mit an, natürlich mit XML Syntax Highlightning. Als Grundlage benutzt ich einen Artikel bzw einen Beispielcode von

http://www.javamagazin.de/itr/online_artikel/psecom,id,364,nodeid,11.html


Aber sowohl das Beispielprogramm als auch meine implementierung (die vom verfahren ja nicht weiter unterschiedlich sind) machen bei dem 1,2MB Schema dicke backen. Out of Memory Error :roll:


War nicht mein Tag heute :wink:
 
ich hab da so ein TableLayout was bei jeder Klasse das stehen hat

Code:
public class TableLayout implements
    java.awt.LayoutManager2,
    Serializable, ....
Nur wenn ich es dann abspeichern will (eigentlich eine andere Klasse, das ist nur ein Objekt was angelegt wird)

Code:
java.io.NotSerializableException: info.clearthought.layout.TableLayout$Entry
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
	at java.util.LinkedList.writeObject(LinkedList.java:681)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:795)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1294)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:367)
	at java.awt.Container.writeObject(Container.java:2765)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:795)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1294)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1224)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1050)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
	at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:367)
	at java.awt.Container.writeObject(Container.java:2765)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:795)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1294)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
	at java.awt.AWTEventMulticaster.saveInternal(AWTEventMulticaster.java:857)
	at java.awt.AWTEventMulticaster.save(AWTEventMulticaster.java:866)
	at java.awt.Component.writeObject(Component.java:6830)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:795)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1294)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1224)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1050)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1224)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1050)
	at java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1224)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1050)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)
	at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1302)
	at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1245)
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1052)
	at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:278)
	at at.dstore.Menu.PosMButton.doProg(PosMButton.java:349)
	at at.dstore.Menu.PosMButton.checkToStart(PosMButton.java:479)
	at at.dstore.Menu.PosMButton$2.mouseReleased(PosMButton.java:118)
	at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:228)
	at java.awt.Component.processMouseEvent(Component.java:5134)
	at java.awt.Component.processEvent(Component.java:4931)
	at java.awt.Container.processEvent(Container.java:1566)
	at java.awt.Component.dispatchEventImpl(Component.java:3639)
	at java.awt.Container.dispatchEventImpl(Container.java:1623)
	at java.awt.Component.dispatchEvent(Component.java:3480)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3450)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3165)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3095)
	at java.awt.Container.dispatchEventImpl(Container.java:1609)
	at java.awt.Window.dispatchEventImpl(Window.java:1590)
	at java.awt.Component.dispatchEvent(Component.java:3480)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:450)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:197)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:144)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)

Warum passiert den sowas?

Obwohl ich es stehen hab!
 
die Klasse TableLayout hat eine innere Klasse "Entry" - die willst du serialisieren, aber sie implementiert nicht Serializable.

Es ist aber nicht ratsam Swing komponenten zu serialiseren - man sollte eigentlich nur die daten die sie halten serialisieren
 
danke 😉 obwohl man selber draufkommen hätte können!

aber was nun?

Code:
java.io.NotSerializableException: java.net.SocketInputStream
	at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1054)
	at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1330)

:bahnhof:
 
Ich konnte das Problem lösen, im Vector waren 3 Klassen in denen wiederum je eine Klasse agregiert wurde. Diese 3 agregierten Klassen habe ich transient gemacht. An stellen wo diese Klassen später noch zur Informationsbeschaffung genutzt wurden habe ich die Berechungen vor die Serialisierung verlegt und das Ergebniss der Berechnungen als String int etc in den Vector gelegt.

Jetzt habe ich nen hübsches Vector Objekt von 850 KByte und statt 3-5 Minuten das XML Schema zu parsen lade ich es einfach in 2 Sekunden von der Platte.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben