Различное поведение в XmlSerializer с / без XmlElement - PullRequest
1 голос
/ 04 января 2012
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
using System.Linq;

namespace Serialize
{    
    public class Good
    {
        public int a;
        public Good() {}

        public Good(int x)
        {
            a = x;
        }
    }

    public class Hello
    {
        public int x;
        public List<Good> goods = new List<Good>();

        public Hello()
        {
            goods.Add(new Good(1));
            goods.Add(new Good(2));
        }
    }

    [XmlRootAttribute("Component", IsNullable = false)]
    public class Component {
        //[XmlElement("worlds_wola", IsNullable = false)]
        public List<Hello> worlds;      

        public Component()
        {
            worlds = new List<Hello>() {new Hello(), new Hello()}; 
        }
    }

    class Cov2xml
    {
        static void Main(string[] args)
        {
            string xmlFileName = "ip-xact.xml";
            Component comp = new Component();

            TextWriter writeFileStream = new StreamWriter(xmlFileName);

            var ser = new XmlSerializer(typeof(Component));
            ser.Serialize(writeFileStream, comp);
            writeFileStream.Close();

        }
    }
}

С этим кодом XmlSerializer я получаю этот XML-файл.

enter image description here

У меня есть только один элемент "worlds", который имеет два элемента Hello.

Однако, когда я добавляю XmlElement перед изменением миров.

[XmlElement("worlds_wola", IsNullable = false)]
public List<Hello> worlds

У меня есть два элемента worlds_wola вместо одного.

enter image description here

Почему это?Как я могу использовать XmlElement для указания имени тега, но только с одним элементом «worlds_wola», как показано ниже?

<worlds_wola>
  <Hello>
   ...
  </Hello>
  <Hello>
   ...
  </Hello>
</worlds_wola>

Ответы [ 2 ]

3 голосов
/ 04 января 2012

Вам необходимо использовать XmlArrayAttribute для вашей коллекции вместо XmlElementAttribute.

0 голосов
/ 04 января 2012

Я нашел, что это именно то, что я хотел, основываясь на ответе Чарльза.

[XmlArray("fileSet")]
[XmlArrayItem(ElementName = "file", IsNullable = false)]
public List<Hello> worlds;   

С этой настройкой я мог бы получить

<fileSet>
    <file>...</file>

Вместо

<worlds>
    <Hello>...</Hello>
...