Buongiorno a tutti.
Ho un problema di serializazione. Ne ho già discusso in questo ng, ma non ne sono venuto a capo. Forse non mi ero
spiegato bene. Ora ho capito meglio il problema. Provo a descriverlo con semplicità.
Ho una classe che fa qualcosa con i colori. Tutti i valori di default dei colori naturalmente non vengono serializzati.
Vengono invece serializzati quando sono diversi da quelli di default. Esempio:
Class ColorClass
Private mBackground=Color.White
Public Property Background
'Serializzata se mBackground diverso da Color.White
End Property
End Class
Ho diverse altre classi che hanno varie proprietà che fanno riferimento alla classe dei colori. Queste classi
inizializzano e usano una o più istanze della classe ColorClass per i loro scopi, impostando di volta in volta il colore
che serve e che naturalmente è diverso a secondo di chi lo adopera e del suo uso. Esempio:
Class MyComponent
Private Sfondo as ColorClass
Public Sub New()
Sfondo.Background=Color.Green 'Qui ho modificato il default di ColorClass: verrà serializzato
End Sub
<DesignerSerializationVisibility(DesignerSerializa tionVisibility.Content)> _
Public Property Sfondo
'Get, Set, ecc.
End Property
End Class
Fin qui tutto bene. Se, a design-time, per esempio cambio il background della classe MyComponent in Color.Red, il nuovo
valore (Color.Red) verrà serializzato perchè Color.Red è diverso sia dal default di ColorClass che dal default di
MyComponent.
Il problema è che se in MyComponent cambio il colore di background in Color.White, questo nuovo valore NON viene
serializzato, e dopo aver rigenerato l'assembly il colore torna a essere Color.Green.
Perchè succede? Succede perchè il nuovo valore che ho impostato a design-time (Color.White) è uguale al default di
ColorClass e quindi non è serializzato e quindi il designer legge il colore di default dell'istanza di MyComponent, cioè
Color.Green. E questo è un problema, perchè io volevo che il background fosse bianco, e non verde.
E' un problema di logica e confesso che con mi è stato facile comprenderne il meccanismo, soprattutto in una gerarchia
di classi un po' complessa. Quando il tipo è booleano, o è un qualsiasi Enum, la probabilità che il problema si
verifichi sono elevate.
Una soluzione sarebbe forzare la serializzazione (ShouldSerializexxx=True oppure eliminando i defaults) ma questa non la
considero una soluzione: è una brutalità.
Bene, se c'è un modo per evitare che questo succeda, io non l'ho trovato. Magari è una sciocchezza...
Qualcuno ha un'idea?
Grazie
Carlo
-------------------------------------------
Carlo, MCP (Windows Based Applications)
ca************@gmail.com
Milan, Italy