Класс Serialze как отдельный безатрибутный элемент с содержимым, установленным в одно свойство - PullRequest
2 голосов
/ 19 января 2012

Я хочу сериализовать / десериализовать следующие типы:

// The "NameEntity" element shouldn't appear in the XML
public class NameEntity
{
    [XmlElement("name")]
    public string Name { get; set; }
}

[XmlRoot("names")]
public class Names : List<NameEntity>
{
}

Я хочу, чтобы сериализованный XML соответствовал следующей схеме:

<?xml version="1.0" encoding="utf-8" ?>
<names>
  <name>Charlie</name>
  <name>Robert</name>
  <name>Nick</name>
</names>

Фактически, выходной XML:

<names>
  <NameEntity>
    <name>Charlie</name>
  </NameEntity>
  ...
</names>

Возможно ли это с одним из атрибутов XML в .NET, или мне придется реализовать IXmlSerializable?

1 Ответ

2 голосов
/ 19 января 2012

Вам нужна комбинация атрибута XmlType и атрибута XmlText примерно так ...

// The "NameEntity" element shouldn't appear in the XML
[XmlType("name")]
public class NameEntity
{
    [XmlText]
    public string Name { get; set; }
}

[XmlRoot("names")]
public class Names : List<NameEntity>
{
}

public class SO
{
    [Test]
    public void NameEntitySerialization()
    {
        var name = new NameEntity() { Name = "Austin" };

        var serialized = <YOUR SERIALIZATION CODE HERE>
        Console.WriteLine(serialized);
        Assert.AreEqual("<name>Austin</name>", serialized);
    }

    [Test]
    public void ListSerialization()
    {
        var names = new Names();
        names.Add(new NameEntity() {Name = "Austin"});

        var serialized = <YOUR SERIALIZATION CODE HERE>
        Console.WriteLine(serialized);
        Assert.AreEqual("<names>\r\n  <name>Austin</name>\r\n</names>",
          serialized);
    }
}
...