将xml反序列化为对象结构c#的问题

时间:2016-09-02 12:13:53

标签: c# xml serialization xml-deserialization

我有以下xml:

<Root>
<ProcessingUnit>Lifestyle</ProcessingUnit>
<ProcessingData>
    <ProcessType>Product</ProcessType>
    <ProcessAction>Create</ProcessAction>
    <Id>7</Id>
</ProcessingData>
</Root>

我有以下对象结构

[XmlRoot("Root")]
public class XmlRoot
{
    ProcessingUnit ProcessingUnit { get; set; }
    [XmlElement("ProcessingData")]
    ProcessingData ProcessingData { get; set; }
}

public class ProcessingData
{
    public ProcessType ProcessType { get; set; }
    public ProcessAction ProcessAction { get; set; }
    public int Id { get; set; }
}

当我反序列化时,我会执行以下操作:

XmlSerializer _serializer = new XmlSerializer(typeof(XmlRoot));
using (var reader = new StringReader(stringtest))
{
     var tradeData = (XmlRoot)_serializer.Deserialize(reader);
}

反序列化为枚举工作正常,正在反序列化processingUnit,但属性ProcessingDatanull

我尝试使用许多不同的xml属性进行装饰,但我不明白为什么我会得到null值。

修改 stringtest变量的值为:

var stringtest =
            "<Root><ProcessingUnit>Lifestyle</ProcessingUnit><ProcessingData><ProcessType>Product</ProcessType><ProcessAction>Create</ProcessAction><Id>7</Id></ProcessingData></Root>";

枚举如下:

public enum ProcessType
{
    [XmlEnum(Name = "Product")]
    Product,

    [XmlEnum(Name = "Category")]
    Category,
}

public enum ProcessAction
{
    [XmlEnum(Name = "Create")]
    Create,

    [XmlEnum(Name = "Delete")]
    Delete,

    [XmlEnum(Name = "Update")]
    Update,
}

public enum ProcessingUnit
{
    [XmlEnum(Name = "LifeStyle")]
    LifeStyle
}

1 个答案:

答案 0 :(得分:1)

属性必须是公开的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string stringtest = "<Root>" +
                "<ProcessingUnit>Lifestyle</ProcessingUnit>" +
                "<ProcessingData>" +
                    "<ProcessType>Product</ProcessType>" +
                    "<ProcessAction>Create</ProcessAction>" +
                    "<Id>7</Id>" +
                "</ProcessingData>" +
                "</Root>";

            XmlSerializer _serializer = new XmlSerializer(typeof(XmlRoot));
            using (var reader = new StringReader(stringtest))
            {
                XmlRoot tradeData = (XmlRoot)_serializer.Deserialize(reader);
            }


        }
    }
    [XmlRoot("Root")]
    public class XmlRoot
    {
        [XmlElement("ProcessingUnit")]
        public ProcessingUnit ProcessingUnit { get; set; }
        [XmlElement("ProcessingData")]
        public ProcessingData ProcessingData { get; set; }
    }
    [XmlRoot("ProcessingData")]
    public class ProcessingData
    {
        [XmlElement("ProcessType")]
        public ProcessType ProcessType { get; set; }
        [XmlElement("ProcessAction")]
        public ProcessAction ProcessAction { get; set; }
        [XmlElement("Id")]
        public int Id { get; set; }
    }
    [XmlRoot("ProcessingUnit")]
    public class ProcessingUnit
    {
        [XmlText] 
        public string text { get; set; }
    }
    [XmlRoot("ProcessType")]
    public class ProcessType
    {
        [XmlText]
        public string text { get; set; }
    }
    [XmlRoot("ProcessAction")]
    public class ProcessAction
    {
        [XmlText]
        public string text { get; set; }
    }
}
相关问题