Ereignis für Serialsierung und Dispose

12/12/2007 - 08:41 von Karsten Sosna | Report spam
Hallo NG,
ich brauch irgendetwas, womit ich mitbekomme, ob eine Klasse serialisiert
bzw. deserialisiert oder etwas Disposed wird. Hier der Grundaufbau der
Klasse:
\\\
<Serializable()> _
Public Class Class1
Private _ImageStream As IO.MemoryStream
<NonSerialized()> _
Private _Image As Bitmap

Public Property Image() As Bitmap
Get
If _ImageStream IsNot Nothing Then
_Image = New Bitmap(_ImageStream)
Return _Image
Else
Return Nothing
End If
End Get
Set(ByVal value As Bitmap)
_Image = value
If _Image IsNot Nothing Then
_ImageStream = New IO.MemoryStream
_Image.Save(_ImageStream, Imaging.ImageFormat.Png)
End If
End Set
End Property
End Class
///
Soweit funktioniert das auch. Anstelle der Bitmap wird Stream serialisiert
bzw. deserialisiert. Das ist auch gut so, da das PNG-Format kompremiert und
das will auch erreichen. Jetzt ist aber so, das ich jedesmal, wenn ich die
Eigenschaft "Image" abfrage die Bitmap erst aus dem Stream geholt wird, bsw.
beim Setzen der Eigenschaft der Stream neu geschrieben wird. Zweiter
Nachteil: Wird die Image-Eigenschaft bzw. die abgefragte Bitmap disposed
besteht mein Memorystream immernoch. Was ich jetzt brauche:
* Beim Serialisieren soll der MemoryStream erst geschrieben werden.
* Beim Deserialisieren soll "_Image" aus dem Stream erzeugt werden.
Wenn ich das so hin bekommen könnte(Pseudo) hàtte ich alle Probleme
beseitigt(hoffe ich zumindest)
\\\
<Serializable()> _
Public Class Class1
Private _ImageStream As IO.MemoryStream
<NonSerialized()> _
Private _Image As Bitmap


<PSEUDO>
Sub OnSerialize
If ImageStream IsNot Nothing Then
_Image = New Bitmap(_ImageStream)
End If
End Sub
Sub OnDeserialize
If _Image IsNot Nothing Then
_ImageStream = New IO.MemoryStream
_Image.Save(_ImageStream, Imaging.ImageFormat.Png)
End If
End Sub
</PSEUDO>

Public Property Image() As Bitmap
Get
Return _Image
End Get
Set(ByVal value As Bitmap)
_Image = value
End Set
End Property
End Class
///

Hoffe ich habe verstàndlich gemacht was ich brauche.

Danke für jeden Tipp
Gruß Scotty
 

Lesen sie die antworten

#1 Karsten Sosna
12/12/2007 - 09:19 | Warnen spam
\\\
<Serializable()> _
Public Class Class1
Private _ImageStream As IO.MemoryStream
<NonSerialized()> _
Private _Image As Bitmap


<PSEUDO>
Sub OnSerialize
If ImageStream IsNot Nothing Then
_Image = New Bitmap(_ImageStream)
End If
End Sub
Sub OnDeserialize
If _Image IsNot Nothing Then
_ImageStream = New IO.MemoryStream
_Image.Save(_ImageStream, Imaging.ImageFormat.Png)
End If
End Sub
</PSEUDO>

Public Property Image() As Bitmap
Get
Return _Image
End Get
Set(ByVal value As Bitmap)
_Image = value
End Set
End Property
End Class
///



Wie immer, kaum gepostet und schon selber gefunden. :=(
\\\
Imports System.Runtime.Serialization

<Serializable()> _
Public Class SSBClass

Private _ImageStream As IO.Stream
<NonSerialized()> _
Private _Image As Bitmap

<OnSerializing()> _
Private Sub OnSerializingMethod(ByVal context As StreamingContext)
If _Image IsNot Nothing Then
_ImageStream = New IO.MemoryStream
_Image.Save(_ImageStream, Imaging.ImageFormat.Png)
End If
End Sub

<OnSerialized()> _
Private Sub OnSerializedMethod(ByVal context As StreamingContext)
End Sub

<OnDeserializing()> _
Private Sub OnDeserializingMethod(ByVal context As StreamingContext)
End Sub

<OnDeserialized()> _
Private Sub OnDeserializedMethod(ByVal context As StreamingContext)
If _ImageStream IsNot Nothing Then
_Image = New Bitmap(_ImageStream)
End If
End Sub

Public Property Image() As Bitmap
Get
Return _Image
End Get
Set(ByVal value As Bitmap)
_Image = value
End Set
End Property
End Class
///

Jetzt gibt es nur noch ein Problem. Wie erkenne ich das _Image disposed
wurde? Nothing ist es dadurch nicht. Ein Freund von Try-Catch bin ich nicht
unbedingt, da man viele Dinge auch abfragen kann bevor man etwas versucht.
Hier wàre es abzufragen ob _Image disposeded wurde, dann braucht man gar
nicht erst versuchen zu speichern.
Gruß Scotty
///

Ähnliche fragen