Сериализация класса под другим именем элемента - PullRequest
0 голосов
/ 24 апреля 2018

У меня есть этот класс:

[XmlRoot(ElementName ="Lesson")]
public class LessonOld
{
    public LessonOld()
    {
        Students = new List<string>();
    }
    public string Name { get; set; }
    public DateTime FirstLessonDate { get; set; }
    public int DurationInMinutes { get; set; }
    public List<string> Students { get; set; }
}

И я использую этот код для сериализации:

TextWriter writer = new StreamWriter(Path.Combine(UserSettings, "Lessons-temp.xml"));
XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<LessonOld>));
xmlSerializer.Serialize(writer, tempList);
writer.Close();

(Обратите внимание, что это List<LessonOld>)

Вот мой полученный XML:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfLessonOld xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <LessonOld>
    <FirstLessonDate>0001-01-01T00:00:00</FirstLessonDate>
    <DurationInMinutes>0</DurationInMinutes>
    <Students />
  </LessonOld>
</ArrayOfLessonOld>

Я хотел бы изменить его на сериализацию как <ArrayOfLesson и <Lesson> для элементов XML. Это возможно? (Как видите, я уже пытался использовать [XmlRoot(ElementName ="Lesson")])

1 Ответ

0 голосов
/ 24 апреля 2018

Ты почти у цели. Использование:

[XmlType(TypeName = "Lesson")]

вместо

[XmlRoot(ElementName = "Lesson")]

Конечно, вы можете проверить это легко; ваш код с вышеуказанным изменением

[XmlType(TypeName = "Lesson")]
public class LessonOld
{
    public LessonOld()
    {
        Students = new List<string>();
    }
    public string Name { get; set; }
    public DateTime FirstLessonDate { get; set; }
    public int DurationInMinutes { get; set; }
    public List<string> Students { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        TextWriter writer = new StreamWriter(Path.Combine(@"C:\Users\Francesco\Desktop\nanovg", "Lessons-temp.xml"));
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<LessonOld>));
        xmlSerializer.Serialize(writer, new List<LessonOld> { new LessonOld() { Name = "name", DurationInMinutes = 0 } });
        writer.Close();
    }
}

производит это

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfLesson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Lesson>
    <Name>name</Name>
    <FirstLessonDate>0001-01-01T00:00:00</FirstLessonDate>
    <DurationInMinutes>0</DurationInMinutes>
    <Students />
  </Lesson>
</ArrayOfLesson>

Как я видел, XmlRoot отлично работает, когда вы хотите сериализовать один объект. Рассмотрим этот код, полученный из вашего:

[XmlRoot(ElementName = "Lesson")]
public class LessonOld
{
    public LessonOld()
    {
        Students = new List<string>();
    }
    public string Name { get; set; }
    public DateTime FirstLessonDate { get; set; }
    public int DurationInMinutes { get; set; }
    public List<string> Students { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        TextWriter writer = new StreamWriter(Path.Combine(@"C:\Users\Francesco\Desktop\nanovg", "Lessons-temp.xml"));
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(LessonOld));
        xmlSerializer.Serialize(writer, new LessonOld() { Name = "name", DurationInMinutes = 0  });
        writer.Close();
    }
}

Будет выводиться

<?xml version="1.0" encoding="utf-8"?>
<Lesson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>name</Name>
  <FirstLessonDate>0001-01-01T00:00:00</FirstLessonDate>
  <DurationInMinutes>0</DurationInMinutes>
  <Students />
</Lesson>
...