序列化没有根元素的数组

时间:2011-01-23 15:01:02

标签: c# xml arrays serialization

我正在尝试在序列化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>

如何删除Property标签? 非常感谢提前

2 个答案:

答案 0 :(得分:6)

如果你真的需要确切的输出,如上所述,你可以使用这样的解决方法:

[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,
}

答案 1 :(得分:2)

不,如果不把事情弄复杂,这是不可能的。一种选择是实施IXmlSerializable hard 以获得100%正确。您可能也可以通过创建两个子类型,使用基于类型的[XmlArrayItem]版本,并将模型破解为碎片。坦率地说,我认为这也不值得。

我个人的偏好是选择不同的布局,或使用LINQ-to-XML。这对XmlSerializer来说并不好。