这是要序列化/反序列化的类。
public class MyDic
{
...
[XmlElement(IsNullable = true)]
public List<WebDefinition> WebDefinitions;
...
}
这是结构
WebDefinition
的完整定义。public struct WebDefinition
{
public string Definition;
public string URL;
public WebDefinition(string def, string url)
{
Definition = def;
URL = url;
}
public override string ToString() { return this.Definition; }
}
我希望在反序列化时
Dictionary.WebDefinitions
可以为空。但当//runtime error : System.InvalidOperationException
XmlSerializer myXml = new XmlSerializer(typeof(Dictionary), "UOC");
为什么我不能使用
XmlElementAttribute.IsNullable
?注1:
当我删除一行
[XmlElement(IsNullable = true)]
时,它正常工作,没有错误(序列化和反序列化)。注2:
异常为System.InvalidOperationException,消息为:
"error occured in during reflection 'UOC.DicData' type"
谢谢。
最佳答案
正如我在评论“特别是innerException”中所指出的;由于您没有添加这个,所以我运行了这个示例,最里面的InnerException
是:IsNullable may not be 'true' for value type WebDefinition. Please consider using Nullable<WebDefinition> instead.
我想这能告诉你你需要的一切。把它改成WebDefinition?
(又名Nullable<WebDefinition>
)确实可以解决这个问题。
但这里的关键点是:读取异常和InnerException
。
在我看来,一个更好的“修正”是使它成为一个class
;因为WebDefinition
不是一个“价值”,所以它没有成为一个struct
的业务。
(尤其是具有公共可变字段的结构是…邪恶):
public class WebDefinition
{
public WebDefinition(){} // for XmlSerializer
public string Definition { get; set; }
public string URL { get; set; }
public WebDefinition(string def, string url)
{
Definition = def;
URL = url;
}
public override string ToString() { return this.Definition; }
}