XML serialization (.NET) node user names

I have the following code:

public class Foo {}

static class Program {
    [XmlElement("foo")] // Ignored :(
    static public List<Foo> MyFoos { get; private set; }

    public static void Main() {
        MyFoos.Add(new Foo());
        MyFoos.Add(new Foo());

        XmlSerializer configSerializer = 
            new XmlSerializer(typeof(List<Foo>), new XmlRootAttribute("foos"));
        using (TextWriter w = new StreamWriter("test.xml"))
        {
            s.Serialize(w, MyFoos);
        }
    }
}

Which creates the following XML file:

<?xml version="1.0" encoding="utf-8"?>
<foos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Foo />
  <Foo />
</foos>

I would like these to be Fooelements marked as Foo, instead ... I understand that this is mostly cosmetic, but it matches what is usually considered normal in XML.

+3
source share
1 answer

It should work if you set the element name directly ...

   [XmlElement( ElementName = "foo" )]

See an example here . Is the point that it should be static? If so, this is not useful, but it works great (added a round-trip message for comment) ...

namespace TestSerial
{
    public class Foo
    {
        public int Value
        {
            get;
            set;
        }
    }
    public class SerializeMe
    {
        private List<Foo> _foos = new List<Foo>();
        public SerializeMe()
        {
        }

        [XmlElement("foo")]
        public List<Foo> MyFoos { get { return _foos; } }

    }

    class Program
    {
        static void Main(string[] args)
        {
            var fs = new SerializeMe();
            fs.MyFoos.Add(new Foo() { Value = 1 });
            fs.MyFoos.Add(new Foo() { Value = 2 });

            var s = new XmlSerializer(typeof(SerializeMe), new XmlRootAttribute("foos"));
            using (var w = new StreamWriter(@"c:\temp\test.xml"))
            {
                s.Serialize(w, fs);
            }

            using (var r = new StreamReader(@"c:\temp\test.xml"))
            {
                var o = s.Deserialize(r);
                var fs2 = (SerializeMe)o;

                fs2.MyFoos.Select(f => f.Value).ToList().ForEach(Console.WriteLine);
            }

            Console.ReadLine();
        }
    }
}

EDIT: (Matthew, OP)

, :

public class Foo {}

[XmlRoot("foos")]
public class FooList 
{
    public FooList() { Foos = new List<Foo>(); }
    [XmlElement("foo")]
    public List<Foo> Foos { get; set; }
}

static class Program 
{
    static private FooList _foos = new FooList();
    static public List<Foo> MyFoos { get { return _foos; } }

    public static void Main() 
    {
        MyFoos.Add(new Foo());
        MyFoos.Add(new Foo());

        XmlSerializer configSerializer = 
            new XmlSerializer(typeof(FooList));

        using (TextReader r = new StreamReader("test.xml"))
        {
            _foos = (FooList)configSerializer.Deserialize(r);
        }

        using (TextWriter w = new StreamWriter("test.xml"))
        {
            configSerializer.Serialize(w, _foos);
        }
    }
}
+10

Source: https://habr.com/ru/post/1712354/


All Articles