C# XML序列化

3

我有这个XML文件;

<ChartXml>
   <Category type="xAxis">
      <Value>Mon</Value>
      <Value>Tue</Value>
      <Value>Wed</Value>
      <Value>Thurs</Value>
      <Value>Friday</Value>
   </Category>
</ChartXml>

而这个类结构;
[XmlRoot("ChartXml")]
public class ChartXml
{
    [XmlElement("Category")]
    public Category Category;            
}

public class Category
{        
    [XmlAttribute("type")]
    public string Type;        
    [XmlArray("Value")]
    public List<string> Values;
}

现在,当我尝试将XML序列化为ChartXml对象时,我得到了一个包含正确设置类型属性的Category对象,但是我没有得到我的字符串列表。我猜想可能是我的类设置有问题。
谢谢, 詹姆斯。

1
识别此类问题的最佳方法是实际上反转您的序列化逻辑。使用与 XML 中所拥有的数据相匹配的数据创建对象。然后尝试对其进行序列化,以使输出与您希望反序列化的数据相同。通过这种方式,您可以实际“看到”可应用于属性的可用属性的效果。如果序列化相同,则还可以进行反序列化。 - Myrtle
2个回答

3

使用[XmlElement("Value")]代替[XmlArray("Value")],例如:

[XmlRoot("ChartXml")]
public class ChartXml
{
    [XmlElement("Category")]
    public Category Category;
}

public class Category
{
    [XmlAttribute("type")]
    public string Type;

    [XmlElement("Value")]
    public List<string> Values;
}

序列化:

var obj = new ChartXml { Category = new Category { Type = "t", Values = new List<string> { "a", "b", "c" } } };
var ser = new XmlSerializer(obj.GetType());

using (var tw=new StringWriter())
{
    ser.Serialize(tw, obj);

    Console.WriteLine(tw.ToString());
}

输出:

<?xml version="1.0" encoding="utf-16"?>
<ChartXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http:
//www.w3.org/2001/XMLSchema">
  <Category type="t">
    <Value>a</Value>
    <Value>b</Value>
    <Value>c</Value>
  </Category>
</ChartXml>

1
谢谢,非常有效。我想因为它是一个列表,所以我认为我需要告诉它这是一个数组,显然不需要。 :) - Cadab

0
请使用 [XmlElement("Value")] 而不是 [XmlArray("Value")]。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接