【问题标题】:InvalidOperationException Error Reflecting ClassInvalidOperationException 错误反映类
【发布时间】:2013-12-08 22:11:17
【问题描述】:

在阅读了多篇与此错误相关的帖子后,没有找到解决我的问题的方法,我在这里解释一下。

我使用 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; }
}

当我点击生成 xml 文件时,使用此代码,我收到错误 InvalidOperationException 反映类型“MergeExcelFiles.Orchard”时出现错误。 {“反映属性‘MyDatas’时出错。”}

就像您在我的 cmets 中看到的那样,我尝试将字符串 xmlElement 添加到节点 MyDatas,通过此更改我没有收到任何错误,但在 xml 文件中我没有任何名称为 Data 的节点。

我不明白为什么类 Recipe 看起来一切正常,但节点 MyDatas 没有显示在 xml 文件中或出现此错误“InvalidOperationException”。

【问题讨论】:

标签: c# xml xml-serialization xmlserializer invalidoperationexception


【解决方案1】:

你需要深入挖掘你的错误信息,因为原因在最里面的异常中:

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

问题是你有一个可以为空的值类型作为属性 (TrendDatas.Id) 被序列化为一个属性,而XmlSerializer 不能很好地处理这些。列出了许多解决方法herehere。它们都不是特别优雅。最好的选择可能是将Id 的定义更改为一个元素:

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

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

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

    // ... snip ...
}

ShouldSerializeId 是一种方法,按照惯例,序列化程序使用它来决定是否应在输出中序列化属性。在 null 值的情况下,序列化输出中不会定义任何元素。

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 2012-01-30
    • 2013-04-05
    • 1970-01-01
    • 2012-04-14
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多