Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将xml反序列化为对象结构c的问题#_C#_Xml_Serialization_Xml Deserialization - Fatal编程技术网

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

C# 将xml反序列化为对象结构c的问题#,c#,xml,serialization,xml-deserialization,C#,Xml,Serialization,Xml Deserialization,我有以下xml: <Root> <ProcessingUnit>Lifestyle</ProcessingUnit> <ProcessingData> <ProcessType>Product</ProcessType> <ProcessAction>Create</ProcessAction> <Id>7</Id> </ProcessingDat

我有以下xml:

<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))
{
     var tradeData = (XmlRoot)_serializer.Deserialize(reader);
}
反序列化到枚举工作正常,processingUnit反序列化正确,但属性
ProcessingData
null

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

编辑: stringtest变量的值为:

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

财产必须公开

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; }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.Xml;
使用System.Xml.Serialization;
使用System.IO;
命名空间Windows窗体应用程序1
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
string stringtest=“”+
“生活方式”+
"" +
“产品”+
“创建”+
"7" +
"" +
"";
XmlSerializer_serializer=新的XmlSerializer(typeof(XmlRoot));
使用(变量读取器=新的StringReader(stringtest))
{
XmlRoot tradeData=(XmlRoot)\ u序列化程序。反序列化(读取器);
}
}
}
[XmlRoot(“根”)]
公共类XmlRoot
{
[XmlElement(“ProcessingUnit”)]
公共处理单位处理单位{get;set;}
[XmlElement(“处理数据”)]
公共处理数据处理数据{get;set;}
}
[XmlRoot(“处理数据”)]
公共类处理数据
{
[XmlElement(“ProcessType”)]
公共ProcessType ProcessType{get;set;}
[XmlElement(“ProcessAction”)]
公共进程操作{get;set;}
[XmlElement(“Id”)]
公共int Id{get;set;}
}
[XmlRoot(“ProcessingUnit”)]
公共类处理单元
{
[XmlText]
公共字符串文本{get;set;}
}
[XmlRoot(“ProcessType”)]
公共类ProcessType
{
[XmlText]
公共字符串文本{get;set;}
}
[XmlRoot(“ProcessAction”)]
公共集体诉讼
{
[XmlText]
公共字符串文本{get;set;}
}
}

您确定您的
stringtest
包含实际的xml吗?我看不到您提供的代码有任何错误。序列化的对象需要无参数构造函数进行序列化/反序列化。您确定ProcessingAction和ProcessingType确实提供了这些吗?有关回复,请参见编辑:)尝试将
XmlRoot
类的属性公开。公开这些属性我现在收到错误“XML文档(1,50)中存在错误”。这是ProcessingData元素开始的点。奇怪,但现在我想我更接近这个问题了,谢谢:)谢谢你的回答。我已经尝试过您的示例,它是有效的-但是当我使用枚举而不是字符串时,它不起作用,然后我得到错误“XML文档(1,50)中存在错误”枚举是整数,而不是字符串。@jdweng这在内存中是正确的,但在XML序列化程序中不是。默认情况下,
XmlSerializer
确实使用枚举的字符串名,而不是整数值。@Stevendogart,是的,这也是我从示例中看到的。
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
}
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; }
    }
}