posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

Interfaccia ISerializable e Serializzazioni Custom

Implementando l'interfaccia ISerializable nelle nostre classi, possiamo personalizzare il processo di serializzazione/deserializzazone dei tipi.
Ad esempio, un istanza di oggetto potrebbe contenere dei dati (ad esempio una password) che non vogliamo che risulti visibile
tramite editor di testo (come notepad) dopo aver serializzato l'oggetto come file su disco.
Nel codice di esempio  è presente una classe Persona  (onnipresente :-) ),  che implementa il metodo GetObjectData (per la fase di serializzazione) con il codice necessario a cifrare il valore del campo "password", ed il costruttore con opportuna firma (per la fase di deserializzazione) nel quale viene decifrato il valore da attribuire al campo "password" dell'oggetto. Ovviamente i metodi utilizzati per cifrare/decifrare il testo dell'esempio sono banali
e non usabili nel mondo reale. Nel codice della classe, sono presenti due metodi, contrassegnati dagli attributi OnSerialized ed
OnDeserialized che permettono d'intercettare rispettivamente la fine del processo di serializzazione e di deserializzazione.
E' possibile intercettare l'inizio delle operazioni di serializzazione e di deserializzazione tramite gli attributi OnSerializing e OnDeserializing.
I metodi che intercettano gli eventi di serializzazione devono accettare un unico parametro di tipo StreamingContext, devono "ritornare Void" e
devono essere contrassegnati dall'attributo che corrisponde con l'evento che vogliamo intercettare.
Il codice "principale" della classe "Persona" è il seguente (in fondo al post è presente il collegamento per eseguire il download dell'
intero codice)

'Classe serializzabile
<Serializable()> _
Public Class Persona
Implements System.Runtime.Serialization.ISerializable

'...definizione campi privati e proprietà
'Costruttore senza parametri
Public Sub New()
End Sub 'In fase di deserializzazone, viene invocato questo costruttore dopo che il formattatore
'ha deserializzato i dati dell'oggetto SerializationInfo.
Protected Sub New(ByVal info As SerializationInfo, ByVal context As StreamingContext)
_nome = info.GetString(
"nome")
_cognome = info.GetString(
"cognome")
_username = info.GetString(
"username")
'Recupera la password decifrandola
_password = OttieniTestoInChiaro(info.GetString("password"))
End Sub

'In fase di serializzazione, l'oggetto Formatter richiama questo metodo per popolare la classe
'SerializationInfo con i dati necessari alla rappresentazione dell'oggetto
Public Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As StreamingContext) Implements System.Runtime.Serialization.ISerializable.GetObjectData
info.AddValue(
"nome", _nome)
info.AddValue(
"cognome", _cognome)
info.AddValue(
"username", _username)
'La password non deve essere in chiaro
info.AddValue("password", OttieniTestoCifrato(_password))
End Sub
<OnSerialized()> _ Private Sub OnSerialized(ByVal context As StreamingContext)
'Ricorda che l'oggetto è stato serializzato
_serializzato = True End Sub
<OnDeserialized()> _ Private Sub OnDeserialized(ByVal context As StreamingContext)
'L'oggetto è stato deserializzato, quindi imposta a False la proprietà Serializzato
_serializzato = False End Sub '...altro codice

End Class

Codice della classe "Persona"

Technorati Tag:

Print | posted on martedì 22 gennaio 2008 13:19 | Filed Under [ Visual Basic .Net ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET