none
Liste mit Attributen serialisieren RRS feed

  • Frage

  • Hallo,

    Gibt es eine Möglichkeit zu einer Liste von Elementen bei der Serialisierung ein Attribut mit anzugeben.

    Bsp. Ich habe eine Liste von Filter-Bedinungen, die Bedingungen sollen entweder mit "And" oder "Or" verknüpft werden.

    Das serialiseirte XML soll etwa so aussehen:

              <Filters operator="And">
                <Filter name="filter1" condition="..." />
                <Filter name="filter2" condition="..." />
              </Filters>

    Die Serialisierung der einzelnen Filter-Objekte mit den Attributen klappt, auch die Serialisierung der Liste ohne das "operator" Attribut klappt. Nur die Serialisierung mit dem "operator" kriege ich nicht hin.

    Habe es schon mit einer von List<> abgeleiteten Klasse mit dem zusätzlichen Property Operator und [XmlAttribute("operator")] darüber versucht:

            [XmlAttribute("operator")]
            public string Operator { get; set; }

    Die Serialisierung erfolgte trotzdem ohne das "operator" Attribut.

    Kann mir jemand weiterhelfen?

    Vielen Dank ...Thomas

    Freitag, 19. Oktober 2012 14:11

Antworten

  • Ah, das geht so nicht. Es liegt daran wie List<T> serialisiert wird. Sie auch diesen Thread. Mit einem eigenen Serialisiere sollte es gehen. Oder eine andere Klassenansatz:

    public FilterList
    {
      public List<Filter> Conditions { get; set}
      public string Operator { get; set; }
    }

    Wobei Operator eher ein Enum sein sollte, statt ein String.
    Sonntag, 21. Oktober 2012 12:42

Alle Antworten

  • Es sollte so eigentlich funktionieren. Wie sieht dein Code aus?

    namespace ConsoleCS
    {
        using System;
        using System.IO;
        using System.Xml.Serialization;
    
        class Program
        {
            static void Main(string[] args)
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Filter));
                using (TextWriter textWriter = new StreamWriter(@"C:\temp\filter.xml"))
                {
                    serializer.Serialize(textWriter, new Filter { Operator = "ADD" });
                    textWriter.Close();
                }
    
                Console.WriteLine("Done.");
                Console.ReadLine();
            }
        }
    
        public class Filter
        {
            [XmlAttribute("operator")]
            public string Operator { get; set; }
        }
    }
    

    Freitag, 19. Oktober 2012 21:05
  • Hallo Stefan,

    Danke für Deinen Antwort. Mein Code sieht so aus:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Xml.Serialization;
    
    namespace FilterConfig
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                var config = new Configuration
                    {
                        Filters = new FilterList<Filter>(logicalOperator: "And")
                        {
                            new Filter {Name = "Filter1", Condition = "Condition1"},
                            new Filter {Name = "Filter2", Condition = "Condition2"},
                        }
                    };
    
                var serializer = new XmlSerializer(typeof(Configuration));
                using (var writer = new StreamWriter(@"C:\temp\filterList.xml"))
                {
                    serializer.Serialize(writer, config);
                }
            }
        }
    
        [Serializable]
        public class Configuration
        {
            public FilterList<Filter> Filters { get; set; }
        }
    
        [Serializable]
        public class FilterList<T> : List<T>
        {
            public FilterList(string logicalOperator)
            {
                this.Operator = logicalOperator;
            }
    
            [XmlAttribute("operator")]
            public string Operator { get; set; }
        }
    
        [Serializable]
        public class Filter
        {
            [XmlAttribute("name")]
            public string Name { get; set; }
    
            [XmlAttribute("condition")]
            public string Condition { get; set; }
        }
    }

    Als XML kommt dann heraus:

    <?xml version="1.0" encoding="utf-8"?>
    <Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Filters>
        <Filter name="Filter1" condition="Condition1" />
        <Filter name="Filter2" condition="Condition2" />
      </Filters>
    </Configuration>

    Was ich erreichen möchte ist aber:

    <?xml version="1.0" encoding="utf-8"?>
    <Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Filters operator="And">
        <Filter name="Filter1" condition="Condition1" />
        <Filter name="Filter2" condition="Condition2" />
      </Filters>
    </Configuration>
    Grüße Thomas


    Sonntag, 21. Oktober 2012 09:10
  • Ah, das geht so nicht. Es liegt daran wie List<T> serialisiert wird. Sie auch diesen Thread. Mit einem eigenen Serialisiere sollte es gehen. Oder eine andere Klassenansatz:

    public FilterList
    {
      public List<Filter> Conditions { get; set}
      public string Operator { get; set; }
    }

    Wobei Operator eher ein Enum sein sollte, statt ein String.
    Sonntag, 21. Oktober 2012 12:42
  • OK - Danke. Der andere Klassenansatz ist wohl die einfachere Lösung.
    Sonntag, 21. Oktober 2012 14:05
  • Hallo Thomas,

    Hat Dir die Antwort von Stefan geholfen? Wenn ja - bitte markiere diese "als Antwort".

    Danke und Grüß,
    Ionut

    Montag, 22. Oktober 2012 14:24
    Moderator