Serialisation Xml, Enums mit FlagsAttribute

Spyke

Premium-User
Hi,
ich habe folgendes Enum
C#:
[Serializable]
[Flags]
public enum MeinEum
{
     [XmlEnum("1")]
     Erster=1,
     [XmlEnum("2")]
     zweiter=2,
     [XmlEnum("4")]
     dritter=4,

     [XmlEnum("7")]
     Alle=Erster | zweiter | dritter
}

Über das XmlEnumAttribute wird ja der Wert des Enums im Xml gespeichert.

Das Problem ist blos wenn meine Eigenschaft z.B. den Wert 6 hält (zweiter | dritter).
Da schmeist mit der XmlSerializer immer eine Exception da 6 nicht definiert ist.

Durch google konnte ich bisher nur in Erfahrung bringen, das man wohl das XmlEnumAttribute vererben soll und dort die Math Methode überschreiben soll.
Habe ich versucht jedoch ist er nie in die Math Methode rein gesprungen.

Deshalb kennt jemand das Problem und hat ne Lösung/Idee parat.
 
Zuletzt bearbeitet von einem Moderator:
Bist du sicher, dass das daran liegt? Folgender Code funktioniert bei mir:

Code:
Imports System.Xml.Serialization

<Serializable()> _
<Flags()> _
Public Enum MeinEnum
     <XmlEnum("1")> Erster = 1
     <XmlEnum("2")> zweiter = 2
     <XmlEnum("4")> dritter = 4

     <XmlEnum("7")> Alle = Erster Or zweiter Or dritter
End Enum

Class Program
     Shared Sub Main()
          Dim var = MeinEnum.zweiter Or MeinEnum.dritter

          Dim ms As New IO.MemoryStream()

          Dim xs As New XmlSerializer(GetType(MeinEnum))
          xs.Serialize(ms, var)

          ms.Seek(0, IO.SeekOrigin.Begin)

          Dim sr As New IO.StreamReader(ms)

          Debug.WriteLine(sr.ReadToEnd())

          ms.Seek(0, IO.SeekOrigin.Begin)

          Dim obj As MeinEnum = xs.Deserialize(ms)

          If (obj And MeinEnum.Erster) = MeinEnum.Erster Then Debug.WriteLine("erster drin")
          If (obj And MeinEnum.zweiter) = MeinEnum.zweiter Then Debug.WriteLine("zweiter drin")
          If (obj And MeinEnum.dritter) = MeinEnum.dritter Then Debug.WriteLine("dritter drin")
          If (obj And MeinEnum.Alle) = MeinEnum.Alle Then Debug.WriteLine("alle drin")

          Console.ReadKey()
     End Sub
End Class

Die Ausgabe ist dann:
<?xml version="1.0"?>
<MeinEnum>2 4</MeinEnum>
zweiter drin
dritter drin

Dasselbe funktioniert auch ohne die XmlEnum-Attribute:
<?xml version="1.0"?>
<MeinEnum>zweiter dritter</MeinEnum>
zweiter drin
dritter drin

Oder hab ich dein Problem falsch verstanden? Ich kann das nämlich im Moment nicht nachvollziehen.
 
Zuletzt bearbeitet:
Falsch verstanden ;)

Ich habe eine Klasse die ich serialisieren will und die hat eine Eigenschaft vom Typ MeinEnum.
C#:
[Serializable]
class MeineKlasse
{
    public MeinEnum Eigenschaft
    {
          get{ return eigenschaft;}
          set{eigenschaft=value;}
     }
     private MeinEnum eigenschaft;
}

Und XmlEnum nutze ich da ich nicht auf die Bezeichnung gehen wollte.
Mit dem Wert ist mir das sicherer für die weiter Entwicklung.
 
Zuletzt bearbeitet von einem Moderator:
Du hast eine Klasse mit Serializable-Attribut, darin die Enumeration wie oben, und eine Eigenschaft mit der Enum als Datentyp?
Davon erzeugst du ein Objekt und serialisierst es? Und beim Deserialisieren tritt der Fehler auf?
Also entweder lieg ich schon wieder daneben, oder bei mir geht es:
Code:
Imports System.Xml.Serialization

<Serializable()> _
Public Class MeineKlasse
     <Serializable()> _
     <Flags()> _
     Public Enum MeinEnum
          <XmlEnum("1")> Erster = 1
          <XmlEnum("2")> zweiter = 2
          <XmlEnum("4")> dritter = 4

          <XmlEnum("7")> Alle = Erster Or zweiter Or dritter
     End Enum

     Private _menum As MeinEnum
     Public Property MEnum() As MeinEnum
          Get
               Return _menum
          End Get
          Set(ByVal value As MeinEnum)
               _menum = value
          End Set
     End Property
End Class

Class Program
     Shared Sub Main()
          Dim o1 As New MeineKlasse()
          o1.MEnum = MeineKlasse.MeinEnum.zweiter Or MeineKlasse.MeinEnum.dritter

          Dim ms As New IO.MemoryStream()

          Dim xs As New XmlSerializer(GetType(MeineKlasse))
          xs.Serialize(ms, o1)

          ms.Seek(0, IO.SeekOrigin.Begin)

          Dim sr As New IO.StreamReader(ms)

          Debug.WriteLine(sr.ReadToEnd())

          ms.Seek(0, IO.SeekOrigin.Begin)

          Dim o2 As MeineKlasse = xs.Deserialize(ms)

          Console.ReadKey()
     End Sub
End Class

<?xml version="1.0"?>
<MeineKlasse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<MEnum>2 4</MEnum>
</MeineKlasse>
 
Zuletzt bearbeitet:
Nu haben wir beide den gleichen Level :D

Aber komisch bei mir will er halt nicht "2 4" speichern sondern "6".
Der Fehler selbst tritt schon beim serialisieren auf.
Kommt ne Exception in der Form "Wert 6 unbekannt", hab jetzt kein VS hier.

Ich verwendet Framework 2, was verwendest du?
Und Umstieg auf ein höheres Framework geht Arbeitstechnisch nicht.
 

Neue Beiträge

Zurück