XML反序列化不起作用

时间:2017-03-22 10:56:16

标签: c# xml deserialization

我试图反序列化下面的XML,但这个过程似乎没有起作用...... 这是我在反序列化XML后在PropertyGrid控件中显示值时得到的结果:

enter image description here

如您所见,Header下的元素没有值。

您能帮忙检查代码有什么问题吗?

消息类:

namespace MyProject
{
    [XmlRoot(ElementName="Header")]
    public class Header {
        [XmlElement(ElementName="Sender")]
        public string Sender { get; set; }
        [XmlElement(ElementName="Receiver")]
        public string Receiver { get; set; }
        [XmlElement(ElementName="MessageID")]
        public string MessageID { get; set; }
        [XmlElement(ElementName="CreationDateTime")]
        public string CreationDateTime { get; set; }
        [XmlAttribute(AttributeName="version")]
        public string Version { get; set; }
    }

    [XmlRoot(ElementName="Message", Namespace="http://example.com")]
    public class Message {
        private Header _header = new Header();

        [XmlElement(ElementName="Header")]      
        [TypeConverter(typeof(ConverterExpandableObject))]
        public Header Header 
        { 
            get { return _header; }
            set { _header = value; }
        }

        [XmlAttribute(AttributeName="ns", Namespace="http://www.w3.org/2000/xmlns/")]
        public string Ns { get; set; }
    }
}

反序列化XML的方法:

void DeserializeMessage()
        {
            string messageString = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\Message.xml";

            if (File.Exists(messageString))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Message));
                StreamReader reader = new StreamReader(messageString);

                Message m = (Message)serializer.Deserialize(reader);
                reader.Close();

                propertyGrid1.SelectedObject = m;
            }
        }

和XML本身:

<?xml version="1.0" encoding="UTF-8"?>
<ns:Message xmlns:ns="http://example.com">
  <Header version="1.0">
    <Sender>3015207400109</Sender>
    <Receiver>8711200999903</Receiver>
    <MessageID>000D2613F64AC021ED783C084735EC78E53</MessageID>
    <CreationDateTime>2017-03-21T08:00:47Z</CreationDateTime>
  </Header>
</ns:Message>

1 个答案:

答案 0 :(得分:1)

更改您的课程,如下所示,它会起作用。

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://example.com")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://example.com", IsNullable = false)]
public partial class Message
{

    private Header headerField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace = "")]
    public Header Header
    {
        get
        {
            return this.headerField;
        }
        set
        {
            this.headerField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class Header
{

    private ulong senderField;

    private ulong receiverField;

    private string messageIDField;

    private System.DateTime creationDateTimeField;

    private decimal versionField;

    /// <remarks/>
    public ulong Sender
    {
        get
        {
            return this.senderField;
        }
        set
        {
            this.senderField = value;
        }
    }

    /// <remarks/>
    public ulong Receiver
    {
        get
        {
            return this.receiverField;
        }
        set
        {
            this.receiverField = value;
        }
    }

    /// <remarks/>
    public string MessageID
    {
        get
        {
            return this.messageIDField;
        }
        set
        {
            this.messageIDField = value;
        }
    }

    /// <remarks/>
    public System.DateTime CreationDateTime
    {
        get
        {
            return this.creationDateTimeField;
        }
        set
        {
            this.creationDateTimeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public decimal version
    {
        get
        {
            return this.versionField;
        }
        set
        {
            this.versionField = value;
        }
    }
}
  

<强>输出

See Result Here