Laden...

Deserialisieren eines Enums mit Kombinationen

Erstellt von gaussmath vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.943 Views
G
gaussmath Themenstarter:in
45 Beiträge seit 2010
vor 11 Jahren
Deserialisieren eines Enums mit Kombinationen

Hallo,

ich verwende folgendes Enum innerhalb eines Objektes, dass ich deserialisieren möchte. Das klappt soweit prima.


    [Serializable]
    public enum WeekDays
    {
        [XmlEnum("1")]
        Sunday = 1,
        [XmlEnum("2")]
        Monday = 2,
        [XmlEnum("4")]
        Tuesday = 4,
        [XmlEnum("8")]
        Wednesday = 8,
        [XmlEnum("16")]
        Thursday = 16,
        [XmlEnum("32")]
        Friday = 32,
        [XmlEnum("64")]
        Saturday = 64,
        [XmlEnum("65")]
        WeekendDays = Sunday | Saturday,
        [XmlEnum("62")]
        WorkDays = Monday | Tuesday | Wednesday | Thursday | Friday,
        [XmlEnum("127")]
        EveryDay = WeekendDays | WorkDays
    }

Nun ergibt sich aber die Problematik, dass ich Kombinationen derart ( Monday | Wednesday o.ä.) deserialisieren möchte. Ich erhalte eine Exception, dass der Wert nicht vorhanden ist.
Ich möchte natürlich unbedingt verhindern, dass ich alle Kombinationen explizit definieren muss. Wie kann ich das umgehen?

Danke und Grüße,
Marc

S
248 Beiträge seit 2008
vor 11 Jahren

Hallo gaussmath,

versuche dies zu verwenden:
Flags

Grüße

G
gaussmath Themenstarter:in
45 Beiträge seit 2010
vor 11 Jahren

Hallo Spook,

ich erhalte mit


    [FlagsAttribute]
    [Serializable]
    public enum WeekDays
    {
        [XmlEnum("1")]
        Sunday = 1,
        [XmlEnum("2")]
        Monday = 2,
        [XmlEnum("4")]
        Tuesday = 4,
        [XmlEnum("8")]
        Wednesday = 8,
        [XmlEnum("16")]
        Thursday = 16,
        [XmlEnum("32")]
        Friday = 32,
        [XmlEnum("64")]
        Saturday = 64,
        [XmlEnum("65")]
        WeekendDays = Sunday | Saturday,
        [XmlEnum("62")]
        WorkDays = Monday | Tuesday | Wednesday | Thursday | Friday,
        [XmlEnum("127")]
        EveryDay = WeekendDays | WorkDays
    }

die gleiche Fehlermeldung: "{"Instanzvalidierungsfehler: '10' ist kein gültiger Wert für global::RecurrenceLibary.WeekDays."}"

[Flags]

habe ich auch bereits versucht.

Danke und Grüße, Marc

309 Beiträge seit 2008
vor 11 Jahren

Wenn Kombinationswerte möglich sein sollen, musst du das FlagsAttribute angeben.

Lies dir mal enum (C#-Referenz) durch.

Hat aber nichts mit der Serialisierung zu tun.

Edit:
Zu langsam...

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

G
gaussmath Themenstarter:in
45 Beiträge seit 2010
vor 11 Jahren

Hallo Scavanger,

ich habe natürlich zuvor gegoogelt und herausgefunden, dass man [Flags] setzen muss, wenn man mit Kombinationen arbeitet. Leider hilft das nicht beim Deserialisieren.

Grüße, Marc

T
314 Beiträge seit 2013
vor 11 Jahren

Hi,

ggf. liegt dein Problem an anderer Stelle !?

Folgender Code funktioniert bei mir ohne Probleme:

[FlagsAttribute]
[Serializable]
public enum WeekDays
{
    [XmlEnum("1")]
    Sunday = 1,
    [XmlEnum("2")]
    Monday = 2,
    [XmlEnum("4")]
    Tuesday = 4,
    [XmlEnum("8")]
    Wednesday = 8,
    [XmlEnum("16")]
    Thursday = 16,
    [XmlEnum("32")]
    Friday = 32,
    [XmlEnum("64")]
    Saturday = 64,
    [XmlEnum("65")]
    WeekendDays = Sunday | Saturday,
    [XmlEnum("62")]
    WorkDays = Monday | Tuesday | Wednesday | Thursday | Friday ,
    [XmlEnum("127")]
    EveryDay = WeekendDays | WorkDays
}
        

public MainWindow()
{
    InitializeComponent();
    XmlSerializer ser = new XmlSerializer(typeof(WeekDays));
    FileStream fsOpen = new FileStream("test.xml", FileMode.Open);
    XmlReader reader = XmlReader.Create(fsOpen);
    var x = ser.Deserialize(reader);
    // x --> Sunday | Monday | Tuesday | Saturday
    reader.Close();
    fsOpen.Close();
    WeekDays day = (WeekDays)71;
            
    File.Delete("test.xml");
            
    Stream fs = new FileStream("test.xml", FileMode.CreateNew);
    XmlWriter writer = new XmlTextWriter(fs, Encoding.Unicode);
    ser.Serialize(writer, day);
    writer.Close();
}

Gruß,
t0ms3n

G
gaussmath Themenstarter:in
45 Beiträge seit 2010
vor 11 Jahren

Hallo t0ms3n,

in der Tat! Das Problem lag/liegt woanders. Ich bin der Sache auch bereits auf der Spur...

Grüße, Marc