PDA

View Full Version : [Java]Problema XMLEncoder


AMD_GO
27-09-2009, 12:38
Salve ragazzi, sto provando a salvare un oggetto in formato xml utilizzando la classe XMLEncoder, ma ho dei problemi. Ecco il codice:

{Questa è la classe Contatto}

import java.io.*;

public class Contatto implements Comparable<Contatto>, Serializable
{
private String nome;
private String cognome;
private String indirizzo;
private String telefono;
private String email;

/**
* Crea un Contatto con Nome, Cognome, Indirizzo, Telefono, Email
*/
public Contatto(String nome, String cognome, String indirizzo, String telefono, String email)
{
this.nome = nome;
this.cognome = cognome;
this.indirizzo = indirizzo;
this.telefono = telefono;
this.email = email;
}

/**
* Crea un contatto vuoto
*/
public Contatto()
{
}

più i metodi get e set per ogni variabile istanza


{Questa è la classe Program, dove viene creata un'istanza della classe Contatto che poi dovrebbe essere salvata in formato xml, cosa che invece non succede}

import java.io.*;
import java.beans.*;

public class Program
{
Contatto c1;

public Program()
{
c1 = new Contatto("Mario", "Rossi", "via", "010", "mario");
}

public void salvaOggettiXML() throws IOException
{

XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("contatti.xml")));

e.writeObject(c1);
e.flush();
e.close();
}



Quando richiamo il metodo salvaOggettiXML() mi da un errore.

java.lang.ClassNotFoundException: Contatto
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Contatto);
Continuing ...

Tuttavia viene creato il file contatti.xml, con intestazione
<?xml versio..........
ma niente di più, il file risulta vuoto....come mai? dove sbaglio?

Grazie a tutti...

PGI-Bis
27-09-2009, 14:41
I passaggi sono corretti ed il codice anche. A me sembra un problema di percorsi dell'ambiente di esecuzione. Forse usi un IDE che fa pasticci col classpath. Prova a compilare ed eseguire il programma da linea di comando, assicurandoti che i file class prodotti dalla compilazione si trovino nella stessa cartella da cui lanci il programma. Dovresti vedere il tutto funzionare correttamente.

AMD_GO
27-09-2009, 17:58
Innanzitutto grazie per avermi risposto....eh si, penso anche io che il codice sia corretto. ho anche provato ad definire un costruttore vuoto creare una istanza della classe Contatto col costruttore vuoto, ma niente....ora provo da linea di comando. Sarà dovuto al fatto che uso BlueJ?

AMD_GO
27-09-2009, 18:03
Infatti questo classNotFound non capisco perchè....

PGI-Bis
27-09-2009, 18:34
E' un messaggio strano perchè se non viene rilasciato in compilazione significa che in quel momento l'ambiente java aveva a disposizione tutti i file class necessari a rendere il programma eseguibile.

Poi in esecuzione XMLEncoder dice che gliene manca uno, quello corrispondente alla classe Contatto.

Quel che non va è il fatto che se il programma non genera una ClassNotFoundException quando viene caricato significa che la classe Contatto c'è. Dopodichè arriva XMLEncoder, cerca di caricare quella classe che la JVM ha trovato (per scrivere l'oggetto genera una nuova istanza di Contatto) ma non la trova.

Forse BueJ pasticcia con il provider che si occupa di stabilire come serializzare i bean?

Per provare a vedere se è così, compila ed esegui il programma senza usare l'IDE.

AMD_GO
27-09-2009, 19:01
Perfetto. Ho provato a compilare a riga di comando e lanciare......tutto funziona. Quindi a questo punto penso sia proprio BlueJ che pasticcia, proprio come hai detto te.....Grazie mille!!!
Altra cosa, sempre per rimanere in tema.....Col codice da me postato in precedenza viene creato un file contatti.xml così come segue:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0" class="java.beans.XMLDecoder">
<object class="Contatto"/>
</java>


Ecco, se io volessi qualcosa del genere:

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0" class="java.beans.XMLDecoder">
<object class="Contatto"/>
<Nome>Mario</Nome>
<Cognome>Rossi</Cognome>
<Indirizzo>via</Indirizzo>
<Telefono>111</Telefono>
<Email>[email protected]</Email>
</java>

come devo agire?


EDIT: aaaaaaaaaaa!!!!!!!!!!! l'indentazione!!!!!!

PGI-Bis
27-09-2009, 19:09
Sembra che c1 non abbia proprietà salvabili. Dovrebbe saltarti fuori una cosa come questa:

Prova a scrivere nel main (pseudo codice):

Contatto c = new Contatto("Mario", "Rossi", "via", "010", "mario");
XMLEncoder encoder = new XMLEncoder(eccetera eccetera)
encoder.writeObject(c);
eccetera

Altrimenti verifica con un debugger che c1 abbia effettivamente delle proprietà assegnate al momento dell'invocazione di writeObject.

AMD_GO
27-09-2009, 19:13
Verissimo.....:doh: stavo pasticciando io con gli oggetti. Gli stavo passando un oggetto costruito con un costruttore vuoto :muro: :muro: :muro: ! ora tutto funziona....Grazie mille ancora!!!!

ora il risultato è questo

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.6.0" class="java.beans.XMLDecoder">
<object class="Contatto">
<void property="cognome">
<string>Rossi</string>
</void>
<void property="email">
<string>[email protected]</string>
</void>
<void property="indirizzo">
<string>Via</string>
</void>
<void property="nome">
<string>Giovanni</string>
</void>
<void property="telefono">
<string>190</string>
</void>
</object>
</java>


un po' pasticciato, ora controllo se si può mettere meglio....