XML Datei schreiben

C

clash

Mitglied
Hallo ich bins wieder... Ihr habt mir letztens super geholfen, aber es gibt wieder etwas bei dem ich nicht weiter komme. Ich soll aus einer Klasse Drawing eine XML Datei schreiben. Also die Klasse Drawing ist eine ArrayList von der Klasse Figure. Figure ist eine abstrakte Klasse als Grundmuster für alle konkreten Figuren. Es gibt die Klassen Ellipse und Rectangle welche die Klasse Figure erweitern. Dazu gibt es dann noch die generische Klasse Tupel zur Verwaltung zweier Werte vom Typ T. Dann folgt noch die Klasse Color, um auf Farben zuzugreifen. So die Klassen Color, Tupel, Drawing und Figure haben jetzt noch zusätzlich eine Subklasse bekommen welche namexDOM heißt. Also 4 zusätzliche Klassen.
Die Aufgabe lautet: Entwickeln, implementieren Sie eine Klasse DrawingDOM, mit der eine Zeichnung, ein Objekt der Klasse Drawing mit den 3 Technologien gespeichert und wieder eingelesen werden kann

Ich weiß jetzt nicht ob ich hier den gesamten Code posten soll, deswegen erstmal nur der Abschnitt welcher Probleme macht.
Java:
public static void writeXMLEncoder (Drawing f, String file) {
        try {
            java.beans.XMLEncoder out = new java.beans.XMLEncoder(new FileOutputStream(file));
            out.writeObject(f);
            out.flush();
            out.close();
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
    }
->das wirft mir den Fehler: java.lang.Exception: Encoder: discarding statement Drawing.setCnt(Integer);
Java:
public void setCnt(int cnt) {
        if (cnt >= 0 && cnt <= shapes.size())
        this.cnt= cnt;
    }
Das ist der Code dazu. wenn ich jetzt setCnt lösche, funktioniert meine Klasse Drawing nicht mehr. Ich komme da irgendwie nicht weiter... Ich hoffe ihr könnt mir Tipps geben :(
 
Oneixee5

Oneixee5

Bekanntes Mitglied
XMLEncoder benötigt ein JavaBeans-Objekt, um es zu serialisieren, daher muss man einen öffentlichen Standardkonstruktor (ohne Argumente) definieren. Also ist das Problem vermutlich bei: shapes zu suchen.
 
Zuletzt bearbeitet:
C

clash

Mitglied
Okay, ich hab den Fehler gefunden, aber eine Datei mit Inhalt schreibt er immer noch nicht. Jedoch bekomme ich keine Fehlermeldung mehr ... :/
 
Zuletzt bearbeitet:
Oneixee5

Oneixee5

Bekanntes Mitglied
XMLEncoder benötigt ein JavaBeans-Objekt, um es zu serialisieren, daher muss man einen öffentlichen Standardkonstruktor (ohne Argumente) definieren. Also ist das Problem vermutlich bei: shapes zu suchen.
Was ist shapes also die konkrete Klasse(n) hinter dem Interface IFigure - haben die alle einen Standardkonstruktor?
 
C

clash

Mitglied
Was ist shapes also die konkrete Klasse(n) hinter dem Interface IFigure - haben die alle einen Standardkonstruktor?
Ja. Die Klasse Rectangle zB sieht so aus:
Java:
public Rectangle(double xpos, double ypos, double width, double height, Color fillcolor, Color linecolor){
            setPosition(xpos, ypos);
            setSize(width, height);
            setColors(fillcolor, linecolor);
        }
     public Rectangle(double xpos, double ypos, double width, double height){
            setPosition(xpos, ypos);
            setSize(width, height);
        }
     public Rectangle(Tupel<Double> position, Tupel <Double>size, Tupel<Color> colors){   
            setPosition(position.x,position.y);
            setSize(size.x,size.y);
            setColors(colors.x,colors.y);
        }
     public Rectangle (Tupel <Double> position, Tupel<Double> size) {;
            setPosition(position.x, position.y);
            setSize(size.x,size.y);
         }
     /*
      * Standardkonstruktor
      */
    
     public Rectangle () {
     }
 
C

clash

Mitglied
Okay, daran kann ich aber nichts ändern. Ich wüsste nicht wie ich diese Klasse umschreiben kann. Grundsätzlich sollen wir nur die Klasse drawingDOM schreiben, an den anderen Klassen sollte soweit nichts verändert werden außer das hinzugefügen vom Interface Serializable
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Evtl. kannst du folgendes machen:
Java:
    FileOutputStream fos = new FileOutputStream(...);
    XMLEncoder encoder = new XMLEncoder(fos);
    encoder.setExceptionListener(new ExceptionListener() {
            public void exceptionThrown(Exception e) {
                System.out.println("Exception! :"+e.toString());
            }
    });
    encoder.writeObject(...);
    encoder.close();
    fos.close();
}
So kannst du weitere mögliche Fehlermeldungen sehen.
 
C

clash

Mitglied
Bildschirmfoto vom 2021-05-21 21-14-47.png

Die Liste kommt an, aber es wird nicht als Object übergeben. Sondern nichts. Das verstehe ich nicht. Wenn ich dazu noch die Funktion
Java:
out.writeObject(f.getShapes)
dazu nehme, bekomme ich in der XML-Datei folgenden Ausdruck:
<object class="java.util.ArrayList">
<void method="add">
<object class="le07.Rectangle"/>
</void>
<void method="add">
<object class="le07.Ellipse"/>
</void>
</object>
</java>
Also wird erkannt, dass es eine Klasse Rectangle und Ellipse gibt. Aber wie kann ich denn auf diese jetzt zugreifen?
Die Ausgabe im Terminal soll identisch zur Ausgabe vom Serializer sein:
Serializer:
c3: Drawing [cnt=2, shapes=[ Umfang = 300.0 Fläche = 5000.0 xpos= 50.0ypos = 20.0 Weite = 100.0 Höhe = 50.0, Umfang = 392.6990816987241 Fläche = 7853.981633974483 xpos= 150.0ypos = 200.0 Weite = 50.0 Höhe = 200.0]]
c1 == c3: true

XMLEncoder:
c4: Drawing [cnt=0, shapes=[]] //genau hier ist das Problem
c1 == c4: false
 
Zuletzt bearbeitet:
Oneixee5

Oneixee5

Bekanntes Mitglied
Nochmal: es müssen die Anforderungen einer Bean erfüllt sein. Folgender Test:
Java:
public class Main {

    public static void main(String[] args) throws Exception {
        final ArrayList<ITest> list = new ArrayList<>();
        final Test t = new Test();
//        t.setA(0);
//        t.setB(99);
        t.setAB(7,99);
        list.add(t);

        final FileOutputStream fos = new FileOutputStream("test.xml");
        final XMLEncoder encoder = new XMLEncoder(fos);
        encoder.setExceptionListener(e -> System.out.println("Exception! :"+e.toString()));
        encoder.writeObject(list);
        encoder.close();
        fos.close();
    }
}

public interface ITest {}

public class Test implements ITest {
    private int a;
    private int b;

    public int getA() {
        return this.a;
    }
//    public void setA(int a) {
//        this.a = a;
//    }
    public int getB() {
        return this.b;
    }
//    public void setB(int b) {
//        this.b = b;
//    }
    public void setAB(int a, int b) {
        this.a = a;
        this.b = b;
    }
}
Das Ergebnis der auskommentierten Variante ist (ohne setAB(int,int);) genau wie erwartet:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<java version="11.0.11" class="java.beans.XMLDecoder">
 <object class="java.util.ArrayList">
  <void method="add">
   <object class="test.Test">
    <void property="b">
     <int>99</int>
    </void>
   </object>
  </void>
 </object>
</java>

Das Ergebnis nach der Änderung:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<java version="11.0.11" class="java.beans.XMLDecoder">
 <object class="java.util.ArrayList">
  <void method="add">
   <object class="test.Test"/>
  </void>
 </object>
</java>
 
Oneixee5

Oneixee5

Bekanntes Mitglied
Eine mögliche Lösung für das Problem will ich noch kurz vorstellen. Deine Klasse Rectangle hat einen Konstruktor für alle benötigten Werte. Also ergänze ich mal die Klasse Test um einen Konstruktor für alle Felder:
Java:
public class Test implements ITest {
    private int a;
    private int b;

    public Test() {
        super();
    }

    public Test(int a, int b) {
        this.a = a;
        this.b = b;
    }

...

Jetzt ist es möglich dem XMLEncoder s.g. PersistenceDelegate-Instanzen bekannt zu machen. In dem Beispiel würde es dann so aussehen:
Java:
        final ArrayList<ITest> list = new ArrayList<>();
        final Test t = new Test();
//        t.setA(0);
//        t.setB(99);
        t.setAB(7,99);
        list.add(t);

        final FileOutputStream fos = new FileOutputStream("test.xml");
        final XMLEncoder encoder = new XMLEncoder(fos);
        encoder.setExceptionListener(e -> System.out.println("Exception! :"+e.toString()));
        encoder.setPersistenceDelegate(Test.class, new PersistenceDelegate() {
            @Override
            protected Expression instantiate(Object oldInstance, Encoder out) {
                final Test old = (Test) oldInstance;
                return new Expression(old, old.getClass(), "new", new Object[] {old.getA() , old.getB()});
            }
        });
        encoder.writeObject(list);
        encoder.close();
        fos.close();
Ich hoffe das Prinzip wird deutlich. Es muss für jede mögliche Klasse, welche in der Liste shapes enthalten ist, eine PersistenceDelegate-Instanz registriert werden. Diese muss eine Expression zurückgeben, mit welcher die Klasse vollständig initialisiert werden kann. Das arguments-Array muss dabei alle Werte für den Konstruktor in der richtigen Reihenfolge enthalten.

Das Ergebnis ist dann so:
XML:
<?xml version="1.0" encoding="UTF-8"?>
<java version="11.0.11" class="java.beans.XMLDecoder">
<object class="java.util.ArrayList">
  <void method="add">
   <object class="test.Test">
    <int>7</int>
    <int>99</int>
   </object>
  </void>
</object>
</java>
 
C

clash

Mitglied
Okay, vielen Dank für die Mühe. Das habe ich auch so teilweise verstanden. Leider bringt mich das nicht weiter. Es hieß wir sollen diesen Code(ais der Klasse FigureDOM):
Java:
public static void writeXMLEncoder(Figure f, String filename) {
        // Write Encoder
        try {
            java.beans.XMLEncoder out = new java.beans.XMLEncoder(new FileOutputStream(filename));
            writeXMLEncoder(f, out);
            out.flush();
            out.close();
        } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }
    }

    /**
     * Speichern (XML) einer Figure in Stream *.xml
     *
     * @param out      - der Stream
     * @param filename - der Dateiname
     */
    public static void writeXMLEncoder(Figure f, java.beans.XMLEncoder out) {
        // Write Encoder
        out.writeObject(f);
        out.writeObject(f.getPosition());
        out.writeObject(f.getSize());
        out.writeObject(f.getColors());
    }
umschreiben und das geht ganz einfach. Was ich nicht nachvollziehen kann und wenn ich das jetzt alles einsetze, was du mir gesagt hast, dann bekomme ich garantiert wieder tausende Fehler im VPL angezeigt.
 
C

clash

Mitglied
Ich kann es mal probieren, aber ich denke eher nicht nein. Ich hab es jetzt auch so geschafft, dass ich die minimale Punktzahl erreicht habe. Das reicht mir erstmal. Vielen dank, euch!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G In Datei schreiben Java Basics - Anfänger-Themen 1
J String in Datei schreiben Java Basics - Anfänger-Themen 4
J Lesen und schreiben in eine Datei(Anfänger- Dateizugriffe) Java Basics - Anfänger-Themen 3
S JSON Datei schreiben und lesen Java Basics - Anfänger-Themen 3
x-tshainge In gespeicherter Datei schreiben? Java Basics - Anfänger-Themen 7
F Mehrere Zeilen zu einer Zeile zusammenfügen und in eine Datei schreiben Java Basics - Anfänger-Themen 1
R Input/Output Dateinamen aus Verzeichnis in Datei schreiben Java Basics - Anfänger-Themen 3
P Erste Schritte Schreiben in eine Datei Java Basics - Anfänger-Themen 9
M In einer Datei schreiben - Java Java Basics - Anfänger-Themen 3
D Daten mit Apache POI in eine Excel Datei schreiben Java Basics - Anfänger-Themen 5
I Input/Output 3 Werte in Datei schreiben, duplikate vermeiden Java Basics - Anfänger-Themen 4
H Integer in Datei schreiben Java Basics - Anfänger-Themen 2
S Input/Output Alphabet in eine Datei schreiben und Anzahl von Zeichen ausgeben. Java Basics - Anfänger-Themen 4
I Datei schreiben, im Klassen-Ordner Java Basics - Anfänger-Themen 15
P Klasse in INI-Datei schreiben Java Basics - Anfänger-Themen 12
M In Datei schreiben Java Basics - Anfänger-Themen 7
Z Problem beim Lesen und Schreiben einer Datei Java Basics - Anfänger-Themen 10
L OOP Mit RandomAccesFile auslesen und in Datei schreiben Java Basics - Anfänger-Themen 8
G Wert in Ascii Datei ändern, ohne die Datei neu zu schreiben Java Basics - Anfänger-Themen 24
K Erste Schritte datei schreiben Java Basics - Anfänger-Themen 5
J Input/Output Daten in Datei schreiben und auslesen Java Basics - Anfänger-Themen 23
W HEX-Zahl in Datei schreiben Java Basics - Anfänger-Themen 6
S ANSI-Datei einlesen UND UTF-8-Datei schreiben Java Basics - Anfänger-Themen 3
S Input/Output Sehr langen String in Datei schreiben Java Basics - Anfänger-Themen 8
B String der eigentlich eine Ansammlung von HEX zeichen ist in datei schreiben in Hex Java Basics - Anfänger-Themen 8
E Methoden Datum , Uhrzeit, Nachricht in txt Datei schreiben Java Basics - Anfänger-Themen 3
E Text Datei Daten Auslesen und Schreiben Java Basics - Anfänger-Themen 3
E String in txt datei schreiben? Java Basics - Anfänger-Themen 4
E txt Datei schreiben und lesen Java Basics - Anfänger-Themen 9
B Input/Output In Datei an eine bestimmte Stelle schreiben Java Basics - Anfänger-Themen 37
C Input/Output Inhalte von ArrayList und JList in Datei schreiben Java Basics - Anfänger-Themen 5
R Array in Text Datei schreiben Java Basics - Anfänger-Themen 2
A Werte per Zufall aus einer Datei ziehen und in eine neue Datei schreiben Java Basics - Anfänger-Themen 9
D Wert von Combobox in Datei schreiben Java Basics - Anfänger-Themen 2
N Datei mit max 2000 Zeilen schreiben Java Basics - Anfänger-Themen 9
G Input/Output System.err zusätzlich in Datei schreiben Java Basics - Anfänger-Themen 27
R Wie Int-Wert in Datei schreiben? Java Basics - Anfänger-Themen 3
L Objekt in Datei schreiben Java Basics - Anfänger-Themen 8
T Input/Output Daten in txt-Datei schreiben - Fehlermeldung Java Basics - Anfänger-Themen 7
S Datenströne - Text in eine Datei einlesen, umwandeln und in eine neue Datei schreiben Java Basics - Anfänger-Themen 6
F \n aus String in Datei schreiben Java Basics - Anfänger-Themen 5
S Datei einlesen und Ergebnis wieder in Datei schreiben Java Basics - Anfänger-Themen 5
M txt-Datei schreiben: Es erscheinen komische Kästchen Java Basics - Anfänger-Themen 4
K weiter schreiben in einer datei Java Basics - Anfänger-Themen 5
P ArrayList in Datei schreiben Java Basics - Anfänger-Themen 5
M Sortierte Tabelle in Datei schreiben Java Basics - Anfänger-Themen 5
A Datei Lesen und Schreiben in gleichen Klasse Java Basics - Anfänger-Themen 3
isowiz Mehrere Threads schreiben in eine Datei Java Basics - Anfänger-Themen 5
M Datei auslesen und Array schreiben?! Java Basics - Anfänger-Themen 8
U String lässt sich nicht in txt datei schreiben! Java Basics - Anfänger-Themen 7
A OOP Binären Datenstrom in Datei schreiben Java Basics - Anfänger-Themen 4
S Array Daten in Binär Datei schreiben/lesen Java Basics - Anfänger-Themen 11
C Abschnittsweise in eine Datei schreiben Java Basics - Anfänger-Themen 2
J Strings aus einer Datei in 2D Array schreiben Java Basics - Anfänger-Themen 3
W Schreiben in Datei - 192 KB Limit Java Basics - Anfänger-Themen 2
S In eine datei schreiben Java Basics - Anfänger-Themen 3
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
J 2-dim Array auslesen und in Datei schreiben Java Basics - Anfänger-Themen 10
L ArrayList über Methode in Datei schreiben Java Basics - Anfänger-Themen 13
U In CSV-Datei schreiben Java Basics - Anfänger-Themen 11
A Textdatei von URL auslesen und in Datei schreiben Java Basics - Anfänger-Themen 5
J Problem mit Datei lesen und schreiben Java Basics - Anfänger-Themen 8
K Daten in eine Text datei schreiben !!!! Java Basics - Anfänger-Themen 6
M Datei Lesen Und Schreiben! -.- Java Basics - Anfänger-Themen 7
A schreiben einer datei Java Basics - Anfänger-Themen 3
K Applet soll Datei schreiben Java Basics - Anfänger-Themen 13
S CSV-Datei einlesen und in MySql schreiben Java Basics - Anfänger-Themen 3
R Sequentielle Datei lesen und schreiben Java Basics - Anfänger-Themen 5
J Objektvariablen in eine Datei schreiben Java Basics - Anfänger-Themen 2
J schreiben in einer datei Java Basics - Anfänger-Themen 8
H mehrere Strings zeitlich versetzt in eine Datei schreiben Java Basics - Anfänger-Themen 3
2 Mit Java in eine WORD-Datei schreiben Java Basics - Anfänger-Themen 18
W Strings in Text-Datei schreiben Java Basics - Anfänger-Themen 5
T Problem bei Schreiben in Datei Java Basics - Anfänger-Themen 4
A Schreiben in eine Datei Java Basics - Anfänger-Themen 5
D An eine ausgewählte Stelle in der Datei schreiben? Java Basics - Anfänger-Themen 7
B Werte mit Schleife in Datei schreiben(zeitgesteuert) Java Basics - Anfänger-Themen 3
G bin-Datei anlegen und schreiben Java Basics - Anfänger-Themen 5
D In ner Datei schreiben Java Basics - Anfänger-Themen 5
T Problem beim schreiben in Datei Java Basics - Anfänger-Themen 7
A Problem beim Schreiben in eine Datei Java Basics - Anfänger-Themen 3
H Russische Zeichen in Datei schreiben und wieder auslesen Java Basics - Anfänger-Themen 3
M bunter text in datei schreiben Java Basics - Anfänger-Themen 6
F Problem mit schreiben in .txt datei Java Basics - Anfänger-Themen 5
L Eclipse text datei schreiben! Java Basics - Anfänger-Themen 3
L Mehrere Objekte mit NIO in eine Datei schreiben Java Basics - Anfänger-Themen 4
J Treepath mit XMLEncode in xml-Datei schreiben Java Basics - Anfänger-Themen 4
B schreiben in Datei in JAR-Datei Java Basics - Anfänger-Themen 2
S ans Ende einer Datei schreiben Java Basics - Anfänger-Themen 3
T Text in Datei schreiben Java Basics - Anfänger-Themen 4
P datei in 2d array schreiben Java Basics - Anfänger-Themen 8
G (Video) in Datei schreiben. Java Basics - Anfänger-Themen 3
R große Datenmenge in Datei schreiben Java Basics - Anfänger-Themen 8
G problem beim schreiben in eine txt datei Java Basics - Anfänger-Themen 2
G in txt datei schreiben Java Basics - Anfänger-Themen 5
H Am ende einer existierenden Datei schreiben? Java Basics - Anfänger-Themen 8
T gezieltes lesen/schreiben in datei Java Basics - Anfänger-Themen 9
S Datei auslesen und neue schreiben (keine Textdatei) Java Basics - Anfänger-Themen 2
G Tabelleninhalt in Datei schreiben Java Basics - Anfänger-Themen 4
D Komfortabel HTML - Datei schreiben Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben