C# 反映类的InvalidOperationException错误

C# 反映类的InvalidOperationException错误,c#,xml,xml-serialization,xmlserializer,invalidoperationexception,C#,Xml,Xml Serialization,Xmlserializer,Invalidoperationexception,在阅读了多篇关于这个错误的文章后,我没有找到解决我问题的方法,我在这里解释一下 我使用XmlSerializer序列化简单类 这是我的密码: private void btnGenerateXml_Click(object sender, RoutedEventArgs e) { Orchard orchard = new Orchard { Recipe = new Recipe {

在阅读了多篇关于这个错误的文章后,我没有找到解决我问题的方法,我在这里解释一下

我使用XmlSerializer序列化简单类

这是我的密码:

    private void btnGenerateXml_Click(object sender, RoutedEventArgs e)
    {
        Orchard orchard = new Orchard
        {
            Recipe = new Recipe
            {
                Name = "Generated by JooWeb.Tools",
                Author = "admin",
                ExportUtc = DateTime.UtcNow
            },
            MyDatas = new MyDatas
            {
                //Test = "test"
                TrendDatas = new TrendDatas
                {
                    Id = null,
                    Status = "Published",
                    TrendDatasPart = new TrendDatasPart
                    {
                        IdSource = 0,
                        PostalCode = "1000",
                        Locality = "Test5",
                        Surface = (decimal)0.00,
                        Price = (decimal)0.00,
                        Type = "",
                        InsertDateIndicator = "",
                        UpdateDateIndicator = "",
                        GetFromDate = DateTime.Now,
                        UpdatedDate = new DateTime(1900, 1, 1)
                    },
                    CommonPart = new CommonPart
                    {
                        Owner = "/User.UserName=admin",
                        CreatedUtc = DateTime.UtcNow,
                        PublishedUtc = DateTime.UtcNow,
                        ModifiedUtc = DateTime.UtcNow
                    }
                }
            }
        };

        XmlSerializer orchardXmlSerializer = new XmlSerializer(typeof(Orchard));
        var path = @"C:\Temp\orchardFileImport_" + string.Format("{0:yyyyMMdd}", DateTime.Today) + ".xml";
        if (File.Exists(path))
            File.Delete(path);
        orchardXmlSerializer.Serialize(File.OpenWrite(path), orchard);
        MessageBox.Show("Finished");
    }
}

[XmlRoot]
public class Orchard
{
    [XmlElement]
    public Recipe Recipe { get; set; }
    [XmlElement(ElementName = "Data")]
    public MyDatas MyDatas { get; set; }
}

public class Recipe
{
    [XmlElement]
    public string Name { get; set; }
    [XmlElement]
    public string Author { get; set; }
    [XmlElement]
    public DateTime ExportUtc { get; set; }
}

public class MyDatas
{
    public MyDatas()
    {

    }

    //[XmlElement]
    //public string Test { get; set; }

    [XmlElement]
    public TrendDatas TrendDatas { get; set; }
}

public class TrendDatas
{
    [XmlAttribute]
    public string Status { get; set; }
    [XmlAttribute]
    public int? Id { get; set; }
    //[XmlIgnore]
    [XmlElement]
    public TrendDatasPart TrendDatasPart { get; set; }
    //[XmlIgnore]
    [XmlElement]
    public CommonPart CommonPart { get; set; }
}

public class TrendDatasPart
{
    [XmlAttribute]
    public int IdSource { get; set; }
    [XmlAttribute]
    public string PostalCode { get; set; }
    [XmlAttribute]
    public string Locality { get; set; }
    [XmlAttribute]
    public decimal Surface { get; set; }
    [XmlAttribute]
    public decimal Price { get; set; }
    [XmlAttribute]
    public string Type { get; set; }
    [XmlAttribute]
    public string InsertDateIndicator { get; set; }
    [XmlAttribute]
    public string UpdateDateIndicator { get; set; }
    [XmlAttribute]
    public DateTime GetFromDate { get; set; }
    [XmlAttribute]
    public DateTime UpdatedDate { get; set; }
}

public class CommonPart
{
    [XmlAttribute]
    public string Owner { get; set; }
    [XmlAttribute]
    public DateTime CreatedUtc { get; set; }
    [XmlAttribute]
    public DateTime PublishedUtc { get; set; }
    [XmlAttribute]
    public DateTime ModifiedUtc { get; set; }
}
使用这段代码,当我单击GenerateXML文件时,我得到了InvalidOperationException错误 反映类型“MergeExcelFiles.Orchard”时出错。 {“反映属性'MyDatas'时出错”。}

正如您在我的评论中所看到的,我尝试向节点MyDatas添加一个字符串xmlElement,通过此更改,我没有收到任何错误,但在xml文件中,我没有任何具有名称数据的节点


我不明白为什么类Recipe看起来很好,但是节点MyDatas在xml文件中没有显示,或者出现了这个错误“InvalidOperationException”。

您需要深入了解错误消息,因为原因在最内部的异常中:

System.InvalidOperationException:无法序列化System.Nullable`1[System.Int32]类型的成员“Id”。XmlAttribute/XmlText不能用于编码复杂类型

问题是,您有一个可为空的值类型作为属性(
TrendDatas.Id
)要序列化为属性,而
XmlSerializer
不能很好地处理这些属性。这里列出了许多变通方法,并进行了讨论。它们都不是特别优雅。最好的选择可能是将
Id
的定义更改为元素:

public class TrendDatas
{
    // ... snip ...

    [XmlElement(IsNullable = true)]
    public int? Id { get; set; }

    public bool ShouldSerializeId() { return Id.HasValue; }

    // ... snip ...
}

ShouldSerializeId
是一种方法,按照惯例,序列化程序使用该方法来决定是否应在输出中序列化属性。如果为空值,则在序列化输出中不会定义任何元素。

我已编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。