Сериализовать массив без корневого элемента
Я пытаюсь получить этот результат при сериализации XML
<Test>
<Category>
<FileName>C:\test.txt</FileName>
<!-- Note that here this is an array of a simple class with two fields
without root -->
<Prop1>1</Prop1>
<Prop2>2</Prop2>
<Prop1>4</Prop1>
<Prop2>5</Prop2>
<!-- End array -->
</Category>
</Test>
Я уже пробовал разные вещи вроде этого
[Serializable]
[XmlRoot("Test")]
public class Test
{
[XmlElement("Category")]
public List<Category> Category= new List<Category>();
}
[Serializable]
[XmlRoot("Category")]
public class Category
{
[XmlElement("FileName")]
public string FileName { get; set; }
[XmlElement("Property")]
public List<Property> Properties = new List<Property>();
}
[Serializable]
public class Property
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
Но я все еще получаю этот вывод:
<Test>
<Category>
<FileName>C:\test.txt</FileName>
<Property>
<Prop1>1</Prop1>
<Prop2>2</Prop2>
</Property>
<Property>
<Prop1>4</Prop1>
<Prop2>5</Prop2>
</Property>
</Category>
</Test>
Как я могу удалить тег свойства?
Большое спасибо заранее
Ответы
Ответ 1
Если вам действительно нужен точный вывод, как указано выше, вы можете использовать обходное решение, подобное этому:
[Serializable]
public partial class Test {
public List<Category> Category;
}
[Serializable]
public partial class Category {
[XmlElement("FileName")]
public string FileName;
[XmlElement("Prop1")]
[XmlElement("Prop2")]
[XmlChoiceIdentifier("propName")]
public string[] Properties;
[XmlIgnore]
public PropName[] propName;
}
public enum PropName {
Prop1,
Prop2,
}
Ответ 2
Нет, это невозможно без сложностей. Один из вариантов - реализовать IXmlSerializable
, который трудно получить на 100% прав. Вы также можете это сделать, создав два подтипа, используя типовые версии [XmlArrayItem]
и взломать модель на куски. Честно говоря, я не думаю, что это того стоит.
Мои личные предпочтения здесь состоят в том, чтобы либо выбрать другой макет, либо использовать LINQ-to-XML. Это нехорошо для XmlSerializer
.