C# XML反序列化不起作用

C# XML反序列化不起作用,c#,xml,deserialization,C#,Xml,Deserialization,我正在尝试反序列化下面的XML,但这个过程似乎不起作用。。。 以下是在反序列化XML后在PropertyGrid控件中显示值时得到的结果: 如您所见,Header下的元素没有值 你能帮我检查一下代码有什么问题吗 消息类: namespace MyProject { [XmlRoot(ElementName="Header")] public class Header { [XmlElement(ElementName="Sender")] publ

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

如您所见,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>

像下面这样改变你的课程,它就会起作用

[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;
        }
    }
}
输出


类标头上不应有属性XMLRoot。问题是因为xml中的命名空间。你能控制这个过程吗?如果是,请使用名称空间管理器删除名称空间。然后反序列化程序就会工作。顺便问一下,为什么要使用partial?@yonan2236当您将XML粘贴为特殊粘贴时,Visual Studio会自动从XML或JSON生成类,并使用partial类。