【问题标题】:Problems with deserializing xml to object structure c#将xml反序列化为对象结构c#的问题
【发布时间】:2016-09-02 12:13:52
【问题描述】:

我有以下 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);
}

反序列化为枚举工作正常,处理单元已正确反序列化,但属性ProcessingDatanull

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

编辑: 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
}

【问题讨论】:

  • 您确定您的stringtest 包含实际的xml 吗?我看不到您提供的代码有任何错误。
  • 被序列化/反序列化的对象需要无参数构造函数。您确定 ProcessingAction 和 ProcessingType 确实提供这些吗?
  • 感谢回复,见编辑:)
  • 尝试公开XmlRoot类的属性。
  • 将它们公开我现在收到错误“XML 文档 (1, 50) 中存在错误”。这是 ProcessingData 元素开始的地方。奇怪,但现在我想我更接近问题了,谢谢:)

标签: c# xml serialization xml-deserialization


【解决方案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; }
    }
}

【讨论】:

  • 感谢您的回复。我已经尝试过您的示例并且它有效 - 但是当我使用枚举而不是字符串时它不起作用,然后我收到错误“XML 文档 (1, 50) 中有错误”
  • 枚举是整数,而不是字符串。
  • @jdweng 在内存中确实如此,但对于 XML 序列化程序则不然。默认情况下,XmlSerializer 确实使用字符串名称而不是整数值。
  • @StevenDoggart,是的,这也是我从示例中看到的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多