C# 反映类的InvalidOperationException错误
在阅读了多篇关于这个错误的文章后,我没有找到解决我问题的方法,我在这里解释一下 我使用XmlSerializer序列化简单类 这是我的密码: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 {
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
是一种方法,按照惯例,序列化程序使用该方法来决定是否应在输出中序列化属性。如果为空值,则在序列化输出中不会定义任何元素。我已编辑了您的标题。请参阅“”,其中的共识是“不,他们不应该”。