我有以下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,但属性ProcessingData
为null
。
我尝试使用许多不同的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
}
答案 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; }
}
}