反序列化 XML 对象。字段未初始化

Deserialize XML object. Fields are not initialized

有一个问题,对象字段被初始化为空。

我已经检查了几个示例,我已经设置了字段注释,但似乎我做错了什么。

这是我的 xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<getInvoiceReply>
    <invoiceID value="944659502"/>
    <invFastener>
        <fastenerID value=""/>
        <fastenerName value=""/>
        <fastenerCount value=""/>
        <fastenerProperty>
            <propID value=""/>
            <propName value=""/>
            <propValue value=""/>
        </fastenerProperty>
    </invFastener>
</getInvoiceReply>

我已经创建了 class 层次结构。

根目录 class InvoiceReply :

 [XmlRoot("getInvoiceReply")]
    public class InvoiceReply
    {
        [XmlAttribute("invoiceID")]
        public string InvoiceId { get; set; }

        [XmlArray("invFastener")]
        public List<InvFastener> InvFastener { get; set; }
    }

class InvFastener :

public class InvFastener
    {
        [XmlAttribute("fastenerID")]
        public string FastenerID { get; set; }

        [XmlAttribute("fastenerName")]
        public string FastenerName { get; set; }

        [XmlAttribute("fastenerCount")]
        public string FastenerCount { get; set; }

        [XmlArray("fastenerProperty")]
        public List<FastenerProperty> FastenerProperty { get; set; }
    }

class FastenerProperty:

public class FastenerProperty
    {
        [XmlAttribute("propID")]
        public string PropId { get; set; }

        [XmlAttribute("propName")]
        public string PropName { get; set; }

        [XmlAttribute("propValue")]
        public string PropValue { get; set; }
    }

测试代码:

 InvoiceReply i = null;

 var serializer =  new XmlSerializer(typeof(InvoiceReply));
 using (var reader = XmlReader.Create("C:\filePathHere\test.xml"))
     {
        i = (InvoiceReply)serializer.Deserialize(reader);      
     }

谁能告诉我为什么会这样?

您的对象存在一些问题。您正在尝试获取属性来代替元素,而您的数组不是数组,它们只是复杂的元素。下面是一个与您的 xml 架构

匹配的工作示例
class Program
{
    static void Main(string[] args)
    {
        string xml = @"<?xml version=""1.0"" encoding=""UTF-8""?>
        <getInvoiceReply>
            <invoiceID value=""944659502""/>
            <invFastener>
                <fastenerID value=""""/>
                <fastenerName value=""""/>
                <fastenerCount value=""""/>
                <fastenerProperty>
                    <propID value=""""/>
                    <propName value=""""/>
                    <propValue value=""""/>
                </fastenerProperty>
            </invFastener>
        </getInvoiceReply>";



        var serializer =  new XmlSerializer(typeof(InvoiceReply));
        var i = (InvoiceReply)serializer.Deserialize(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)));  

        Console.ReadKey();
    }
}

//Generic class for getting value attribute
public class ValueElement
{
    [XmlAttribute("value")]
    public string Value { get; set; }
}

[XmlRoot("getInvoiceReply")]
public class InvoiceReply
{
    [XmlElement("invoiceID")]
    public ValueElement InvoiceId { get; set; } //This is a value element

    [XmlElement("invFastener")]
    public List<InvFastener> InvFastener { get; set; } //This is an element, not an array
}

public class InvFastener
{
    [XmlElement("fastenerID")]
    public ValueElement FastenerID { get; set; }//This is a value element

    [XmlElement("fastenerName")]
    public ValueElement FastenerName { get; set; }//This is a value element

    [XmlElement("fastenerCount")]
    public ValueElement FastenerCount { get; set; }//This is a value element

    [XmlElement("fastenerProperty")]
    public List<FastenerProperty> FastenerProperties { get; set; } //This is an element, not an array
}

public class FastenerProperty
{
    [XmlElement("propID")]
    public ValueElement PropId { get; set; }//This is a value element

    [XmlElement("propName")]
    public ValueElement PropName { get; set; }//This is a value element

    [XmlElement("propValue")]
    public ValueElement PropValue { get; set; }//This is a value element
}