vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Serialisierung mit XML und 2 Classen 
Autor: ModeratorDaveS (Moderator)
Datum: 25.06.11 11:07

XmlInclude in MSDN nachschlagen. Steht doch in der Meldung. Oder in den .Net Foren suchen. Und kannst du nicht endlich von dieser furchtbaren Arraylist wegkommen und List(Of ) verwenden? Dann hast du eventuell sowieso kein Problem mehr.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Serialisierung mit XML und 2 Classen 
Autor: FohnBit
Datum: 25.06.11 10:24

Hallo,

ich serialisiere via XML eine Class, welche Arraylists mit wiederum einer Class enthält:
Auszug:
<Serializable()> Public Class clsFenster
    Implements System.ICloneable
 
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Return MyBase.MemberwiseClone
    End Function
 
    Public objHintergrundbild As Object
 
    <Xml.Serialization.XmlIgnore()> _
    Public Property Hintergrundbild() As Image
        Get
 
            Dim strToByte() As Byte
            strToByte = objHintergrundbild
            If Not strToByte Is Nothing Then
                Return Image.FromStream(New System.IO.MemoryStream(strToByte))
            End If
            Return Nothing
        End Get
        Set(ByVal Value As Image)
 
            Dim msMemoryStream As New System.IO.MemoryStream()
 
            Value.Save(msMemoryStream, System.Drawing.Imaging.ImageFormat.Png)
            Dim myByte(msMemoryStream.Length - 1) As Byte
            msMemoryStream.Position = 0 : msMemoryStream.Read(myByte, 0, _
              msMemoryStream.Length)
            objHintergrundbild = myByte
        End Set
    End Property
 
 
    Public objAusrichtungsbild As Object
 
    <Xml.Serialization.XmlIgnore()> _
    Public Property Ausrichtungsbild() As Image
        Get
 
            Dim strToByte() As Byte
            strToByte = objAusrichtungsbild
            Return Image.FromStream(New System.IO.MemoryStream(strToByte))
 
        End Get
        Set(ByVal Value As Image)
 
            Dim msMemoryStream As New System.IO.MemoryStream()
 
            Value.Save(msMemoryStream, System.Drawing.Imaging.ImageFormat.Png)
            Dim myByte(msMemoryStream.Length - 1) As Byte
            msMemoryStream.Position = 0 : msMemoryStream.Read(myByte, 0, _
              msMemoryStream.Length)
            objAusrichtungsbild = myByte
        End Set
    End Property
 
 
    Public objHintergrund As Object
 
    <Xml.Serialization.XmlIgnore()> _
    Public Property Hintergrund() As Image
        Get
 
            Dim strToByte() As Byte
            strToByte = objHintergrund
            Return Image.FromStream(New System.IO.MemoryStream(strToByte))
 
        End Get
        Set(ByVal Value As Image)
 
            Dim msMemoryStream As New System.IO.MemoryStream()
 
            Value.Save(msMemoryStream, System.Drawing.Imaging.ImageFormat.Png)
            Dim myByte(msMemoryStream.Length - 1) As Byte
            msMemoryStream.Position = 0 : msMemoryStream.Read(myByte, 0, _
              msMemoryStream.Length)
            objHintergrund = myByte
        End Set
    End Property
 
 
    Public Aufnahmedatum As Date
    Public Aufnahmezeit As String
    Public polygon As New ArrayList
    Public vMarker As New clsMarker
 
End Class
 
Public Class clsMarker
    Public Koordinaten As PointF
    Public vAusrichtung As enuAusrichtung
End Class
in die Variable vMarker wird mittels .add() ein Objekt der Class clsMarker gelegt.

Das Funktioniert im Code ja auch 1a.

Wenn ich nun aber serialisiere:
Try
            Dim ser As XmlSerializer = New XmlSerializer(GetType(clsFenster))
            writer = New XmlTextWriter(strFileName, New _
              System.Text.UTF8Encoding())
            ser.Serialize(writer, vFenster)
            writer.Close()
        Catch ex As Exception
            Throw ex
        Finally
 
        End Try
schmeißt er mir einen Fehler um die Ohren:
Der Typ Tracker.clsMarker wurde nicht erwartet. Verwenden Sie das XmlInclude- oder das SoapInclude-Attribut, um Typen anzugeben, die nicht statisch sind.

Weiß jemand wie ich das löse?

Danke!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung mit XML und 2 Classen 
Autor: FohnBit
Datum: 25.06.11 12:19

Hallo Dave,

Ok, habs mal auf List of abgeändert und XMLInclude hinzugefügt:
    Public polygon As New List(Of PointF)
    Public vMarker As New List(Of clsMarker)
<Serializable()> <System.Xml.Serialization.XmlInclude(GetType(Bitmap))> _
  Public Class clsMarker
 
    Private _vAusrichtung As enuAusrichtung
    Public Property vAusrichtung() As enuAusrichtung
        Get
            Return _vAusrichtung
        End Get
        Set(ByVal value As enuAusrichtung)
            _vAusrichtung = value
        End Set
    End Property
 
    Public Koordinaten As PointF
    Public objHintergrundbild As Object
 
    <Xml.Serialization.XmlIgnore()> _
    Public Property Hintergrundbild() As Image
        Get
 
            Dim strToByte() As Byte
            strToByte = objHintergrundbild
            If Not strToByte Is Nothing Then
                Return Image.FromStream(New System.IO.MemoryStream(strToByte))
            End If
            Return Nothing
        End Get
        Set(ByVal Value As Image)
 
            Dim msMemoryStream As New System.IO.MemoryStream()
 
            Value.Save(msMemoryStream, System.Drawing.Imaging.ImageFormat.Png)
            Dim myByte(msMemoryStream.Length - 1) As Byte
            msMemoryStream.Position = 0 : msMemoryStream.Read(myByte, 0, _
              msMemoryStream.Length)
            objHintergrundbild = myByte
        End Set
    End Property
End Class
Damit kann ich zwar speichern, aber beim öffnen erhalte ich:
{"Ungültiger Parameter."}

Wenn ich das XML öffne sehe ich das das Bild wohl nicht richtig abgespeichert wird:
Ein Bild im XML direkt in der serialisierten Class:
objHintergrundbild _
  xsi:type="xsd:base64Binary">iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AA_
  AAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAOSURBVCh_
  TY2AYBYMzBAABmgABVDKHNgAAAABJRU5ErkJggg==</objHintergrundbild>
jedoch das Bild das über "List of class"eingebunden wird:
objHintergrundbild xsi:type="Bitmap"><Palette /></objHintergrundbild>
der Type ist anders ... bearbeite ich das XML und kopiere die obige Info in die untere, kann ich das File normal laden.

Weißt was beim speichern noch falsch ist?

Danke!

Beitrag wurde zuletzt am 25.06.11 um 12:20:28 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung mit XML und 2 Classen 
Autor: FohnBit
Datum: 25.06.11 13:15

Hallo,

ich habs nun anders gelöst.
Ich habe die 3 Variablen als jeweils eigenständige List(of) in die Start Class eingefügt. nun klappt es!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Serialisierung mit XML und 2 Classen 
Autor: ModeratorDaveS (Moderator)
Datum: 25.06.11 13:34

XmlSerializer hat einige Einschränkungen. Du kannst eine Image-Datei bzw Bitmap (und viele anderen Klassen) so nicht direkt serializieren, zuerst zB in Byte() umwandeln, dann geht's. Aber das siehst du ja schon.

________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel