[Java] object opslaan als xml

Pagina: 1
Acties:
  • 116 views sinds 30-01-2008
  • Reageer

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Ik heb een class AccountManager, waar een aantal object Account in kunnen zitten. Om deze op te slaan dacht ik xml te gebruiken, maar de sun site maakt me ook niet echt veel wijzer.

Dit is m'n eerste contact met xml trouwens.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
public class Account {
    
    // server information
    String  alias;
    String  incoming;
    String  outgoing;
    String  account;
    String  password;
    
    // personal information
    String  name;
    String  email;
    String  replyTo;
    String  signature;
    
    
    public Account(String alias, String incoming, String outgoing, String account, String password,
    String name, String email, String replyTo, String signature) {
        this.alias = alias;
        this.incoming = incoming;
        this.outgoing = outgoing;
        this.account = account;
        this.password = password;
        this.name = name;
        this.email = email;
        this.replyTo = replyTo;
        this.signature = signature;
        
    }
    public Account(String alias) {
        this.alias = alias;
        this.incoming = "";
        this.outgoing = "";
        this.account = "";
        this.password = "";
        this.name = "";
        this.email = "";
        this.replyTo = "";
        this.signature = "";
        
    }
    public String toString() {
        return " " + this.alias;
    }
}

Dit is het bestand dat ik zou willen bekomen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version='1.0' encoding='utf-8'?>
<account>
    <alias>Nephilim</alias>
    <incoming>mail.nephilimco.com</incoming>
    <outgoing>mail-out.telenet.be</outgoing>
    <account>junk@nephilimco.com</account>
    <password>junk</password>
    <name>Nephilim</name>
    <email>nephilim@nephilimco.com</email>
    <replyTo></replyTo>
    <signature></signature>
</account>

Verwijderd

Leuke vraag, heb ik ook net over aan het denken... >:)

Ik ben zover dat ik objecten in een bestand op kan slaan;
dat doe je door het object in kwestie serializable te maken en het dan tegen een ObjectOutputStream aan te gooien.
Dit werkt goed, alleen krijg je dan een binary bestand en geen XML.

Voor het geval je het interessant vind, zover ben ik;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.io.*;
import java.util.Vector;
import java.util.Iterator;

class CarList 
{
    public static void main(String[] args) 
    {
        String sEnteredName = new String();
        Vector vCarVector = new Vector();
        System.out.println("***Program started***");

        System.out.println("read the previous stored car objecs from a file");
        try
        {
            ObjectInputStream oInputStream = new ObjectInputStream(new FileInputStream("CarObjectFile.txt"));
            Car oReadCar = (Car)oInputStream.readObject();
            
            while(oReadCar!=null)
            {
                
                vCarVector.add(oReadCar);
                System.out.println("<"+oReadCar.getName());
                oReadCar = (Car)oInputStream.readObject();
            }
        }
        catch(Exception e)
        {
            System.out.println("Duh ! There was an error:" + e);
        }

        System.out.println("Read the new entered car from the prompt");
        try
        {
            try
            {
                System.out.println("Enter a name for a new car");
                byte b[] = new byte[100];
                System.in.read(b);
                String sTempEnteredName = new String(b);
                sEnteredName = sTempEnteredName;
            }
            catch(Exception e)
            {
                System.out.println("Error while reading from Keyboard: "+e);
            }

            System.out.println("Add the car to the Vector");
            Car oNewCar = new Car(sEnteredName);
            Car oDummyCar = new Car("temp");
            vCarVector.add(oNewCar);
            System.out.println("Print the new list of cars to the screen and write to file");
            Iterator iTT= vCarVector.iterator();
            ObjectOutputStream oOutputStream = new ObjectOutputStream(new FileOutputStream("CarObjectFile.txt"));
            for (; iTT.hasNext(); ) 
            {
                oDummyCar = (Car)iTT.next();
                System.out.println(">" +oDummyCar.getName()  );
                oOutputStream.writeObject(oDummyCar);

            }

            
            

            }
        catch(Exception e)
        {
            System.out.println("Serious error, no use in continuing : "+e);
        }
        System.out.println("***Program exited***");
    }
}

public class Car implements java.io.Serializable
{
    String name;
    Car(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void setName(String name){
        this.name = name;
    }
}

Bovenstaande Code laat zien hoe je een collectie opjecten uit een bestand leest en er weer naar toe schrijft.
Ik heb een vector gebruikt om ze in m'n code met een itterator als een lijst door te kunnen lopen...

Ik hoop dat er iets van een XMLOutputStream bestaat die hetzelfde zou kunnen met een XML bestand i.p.v. een binary bestand, maar daar zul je toch de echte javagoeroes voor moeten hebben ben ik bang... :P

Verwijderd

Ahem... XMLOutputStream was natuurlijk onzin;
ik lees net dat je dat kan doen met JavaBeans, die hebben
java.beans.XMLEncoder en XMLDecoder classes waarmee je een collectie beans van- en naar een bestand kunt gooien.
(vond ik in dit draadje; [topic=331223/1/25] )

Mmm, dat JavaBeans klinkt als iets heel gewichtigs voor slimme mensen, maar, dat dacht ik ook van serialization,
ik ga d'r toch eens induiken :)

  • Jelmer
  • Registratie: Maart 2000
  • Laatst online: 20:51
Dit kan zeker met XML. JDK1.4 heeft hier standaard objecten voor. Bekijk de api van java.beans.XMLEncoder maar eens.

[edit]
Je bent er al achter zie ik :)


Hier een stukje voorbeeld code:
code:
1
2
3
4
5
     XMLEncoder e = new XMLEncoder(
                  new BufferedOutputStream(
                    new FileOutputStream("Test.xml")));
     e.writeObject(new JButton("Hello, world"));
     e.close();

Makkelijke he? :)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je kan ook even kijken naar JDOM (gebruik ik zelf). XML schrijven en lezen is echt ongelovelijk eenvoudig. Heb alleen problemen om regelnr op te halen voor foutmelding, maar dat schijnt gefixed te kunnen worden.

ps: ga nooit meer serializen!!! het is echt ongelovelijk slecht voor long term persistance omdat je je objecten soms niet meer in je nieuwe object structuur kan krijgen. Ik gebruik het helemaal nergens meer voor.

Verwijderd

JDK1.4 heeft hier standaard objecten voor
... hmz... 1.3.1 niet :(

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Ik heb het even geprobeerd, met deze code, maar ik krijg steeds een error.

(Class Account is nog steeds hetzelfde als hierboven)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.beans.XMLEncoder;
public class xmltest {
    
    public static void main(String args[]) {
        
        Account ac = new Account("Nephy", "mail.nephilimco.com", "mail-out.telenet.be", "junk@nephilimco.com", "junk", "Nephilim", "junk@nephilimco.com", "", "");
        try {
            XMLEncoder e = new XMLEncoder(
                      new BufferedOutputStream(
                        new FileOutputStream("Test.xml")));
            e.writeObject(ac);
            e.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        
    }
}


code:
1
2
3
4
java.lang.InstantiationException: Account
Continuing ...
java.lang.Exception: discarding statement XMLEncoder0.writeObject(Account0);
Continuing ...

  • Tomatrix
  • Registratie: Juni 1999
  • Laatst online: 27-02-2025
Ik denk dat je een Account constructor met 0 argumenten nodig hebt.

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Op dinsdag 02 april 2002 13:26 schreef Tomatrix het volgende:
Ik denk dat je een Account constructor met 0 argumenten nodig hebt.
Inderdaad, dat loste het probleem op, maar nu krijg ik dit als resultaat:
code:
1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.4.0" class="java.beans.XMLDecoder">
 <object class="Account"/>
</java>

M'n variabelen worden dus niet mee opgenomen.. :?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

kijk even naar:
[topic=324232/1/50]
[topic=414337/1/50]

dan word je wel wat duidelijker over algemeen XML gebeuren. En die XMLOutputStream levert niet zulke leesbare XML op, daarom kan je het beter met de hand doen.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Is Account wel Serializable ?

Verwijderd

Leuk trouwens dat je ons de login voor je 'Junk' mailbox geeft .... >:)

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Op dinsdag 02 april 2002 14:15 schreef MisterData het volgende:
Is Account wel Serializable ?
Euh .. ik heb er es Account implements Serializable van gemaakt, maar dit loste niets op .. maar zo eenvoudig zal het wel niet zijn zeker?

  • Nephilim
  • Registratie: Augustus 2000
  • Laatst online: 15-05 00:38
Op dinsdag 02 april 2002 15:17 schreef Segunda@Tweakers het volgende:
Leuk trouwens dat je ons de login voor je 'Junk' mailbox geeft .... >:)
Dit account is enkel gemaakt om m'n pop3 clientje op te testen hoor :P
Pagina: 1