Pen nicht serialisierbar?

23/12/2007 - 22:28 von Peter Gast | Report spam
Hallo
ich habe in einer Klasse einige Properties als Pen deklariert. Beim
Serialisieren dieser Klasse meckert der Compiler, dass Pen nicht als
Serialisierbar gekennzeichnet ist. Können keine Pen-Eigenschaften
serialisiert werden?

Peter
 

Lesen sie die antworten

#1 Karsten Sosna
24/12/2007 - 09:05 | Warnen spam
ich habe in einer Klasse einige Properties als Pen deklariert. Beim
Serialisieren dieser Klasse meckert der Compiler, dass Pen nicht als
Serialisierbar gekennzeichnet ist. Können keine Pen-Eigenschaften
serialisiert werden?



Hallo Peter,
also dass Pens nicht serlialisierbar sind hast Du ja schon festgestellt.
Irgendwo hatte ich aber mal gelesen, das es einen Umweg über
ISerializationSurrogate gibt. Habe das nie gemacht.
Eine andere Möglichkeit besteht darin nur die relevanten Informationen über
den Pen zu speichern und Private Pen-Member selber als nicht serialisierbar
zu kennzeichnen. So vielleicht:
\\\
<Serializable()> _
Private Class TestPenClass
<NonSerialized()> _
Private _Pen As Pen

Private _penIsNothing As Boolean
Private _penWidth As Single
Private _penColor As Color

<OnSerializing()> _
Private Sub OnSerializingMethod(ByVal context As StreamingContext)
If _Pen Is Nothing Then
_penIsNothing = True
Else
_penIsNothing = False
_penWidth = Pen.Width
_penColor = Pen.Color
End If
End Sub

<OnDeserialized()> _
Private Sub OnDeserializedMethod(ByVal context As StreamingContext)
If Not _penIsNothing Then
_Pen = New Pen(_penColor, _penWidth)
End If
End Sub

Public Property Pen() As Pen
Get
Return _Pen
End Get
Set(ByVal value As Pen)
_Pen = value
End Set
End Property
End Class
///
Testanwendung:
\\\
Dim testPen As New TestPenClass

'testPen.Pen = New Pen(Color.Red, 12) 'Hier mal die Kommentierung wegnehmen

Dim s As IO.FileStream
s = IO.File.OpenWrite("C:\Temp\Pen.bin")
Dim formatter As New Formatters.Binary.BinaryFormatter
formatter.Serialize(s, testPen)
s.Close()

s = IO.File.OpenRead("C:\Temp\Pen.bin")
testPen = DirectCast(formatter.Deserialize(s), TestPenClass)
s.Close()

If testPen.Pen IsNot Nothing Then
Console.WriteLine(testPen.Pen.Color.ToString)
Console.WriteLine(testPen.Pen.Width.ToString)
Else
Console.WriteLine("Pen is nothing")
End If
///
Wie gesagt obige Klasse müsste noch erweitertert werden hinsichtlich Caps,
Dashstyle etc.
Gruß Scotty

Ähnliche fragen