XMLSerializer

lunedì 19 maggio 2008 - 09.03

Teech Profilo | Expert

Stò provando a fare una semplice operazione di serializzazione e deserializzazione con la classe XMLSerializer.
In fase di Serializzazione tutto OK, mentre in fase di deserializzazione mi viene restituita un'eccezzione che non capisco.
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Il file XML è formattato correttamente (anche perchè lo ha creato il metodo di serializzazione). Allego struttura del file XML
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Il codice che utilizzo è un pattern Singleton per memorizzare delle configurazioni ed utilizzo la serializzazione per scrivere e leggere un file XML.
Public Class MiaClasse 'Oggetto per il controllo del singleton Private Shared _Values As MiaClasse Private Const _FileConfig As String = "MioFile.xml" Shared Sub New() Load() End Sub Public Shared ReadOnly Property Value() As MiaClasse Get 'Controlla che non esista un'istanza della classe (Singleton) If (_Values Is Nothing) Then 'istanzia la classe solo se non già istanziata _Values = New MiaClasse End If 'Ritorna la classe istanziata Return _Values End Get End Property Friend Shared Sub Load() 'Deserializza il file XML Using fs As New IO.FileStream(_FileConfig, IO.FileMode.Open) Dim xser As New Xml.Serialization.XmlSerializer(GetType(MiaClasse)) _Values = CType(xser.Deserialize(fs), MiaClasse) End Using End Sub Public Shared Sub Save() 'Serializza il file XML Using fs As New IO.FileStream(_FileConfig, IO.FileMode.Create) Dim xser As New Xml.Serialization.XmlSerializer(GetType(MiaClasse)) xser.Serialize(fs, _Values) End Using End Sub #Region "Proprietà" ... Messe proprietà Public Read/Write tutte di tipo String (per ora) ... #End Region End Class
Ho fatto diverse prove senza successo... Onestamente non capisco il senso dell'errore...
Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

rossimarko Profilo | Guru

Ciao,

io ho fatto una prova e funziona tutto correttamente

Ti giro il codice di esempio che consiste in due semplici pulsanti (serializza/deserializza):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

L'unica cosa che ho cambiato nella tua classe è la definizione del path del file:
Private Const _FileConfig As String = "d:\MioFile.xml"

e poi la funzione di caricamento perchè ho messo una verifica dell'esistenza del file:
Friend Shared Sub Load() If IO.File.Exists(_FileConfig) Then 'Deserializza il file XML Using fs As New IO.FileStream(_FileConfig, IO.FileMode.Open) Dim xser As New Xml.Serialization.XmlSerializer(GetType(MiaClasse)) _Values = CType(xser.Deserialize(fs), MiaClasse) End Using End If End Sub

Puoi mandarci il codice completo della classe e l'esempio che fai per provare la deserializzazione?
-----------------------------------------
Rossi Marco
http://blogs.dotnethell.it/rossimarko

Teech Profilo | Expert

Ho apprezzato molto il controllo di esistenza del file che non avevo pensato (ma un errore futuro mi avrebbe sicuramente fatto venire alla mente)...
La cosa più imbarazzante è che ho scoperto l'errore...
Chiamando il file XML con il nome della classe veniva sovrascritto in fase di Debug da un altro file utile a VS...

Grazie mille per le dritte, per l'interessamento ma soprattutto per l'aiuto
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5