我不能在序列化/反序列化中使用XmlElementAttribute.IsNullable

mjk*_*026 2 c# xml serialization

这是我的序列化/反序列化的类.

public class MyDic
{
    ...

    [XmlElement(IsNullable = true)]
    public List<WebDefinition> WebDefinitions;                      

    ...
}
Run Code Online (Sandbox Code Playgroud)

它是结构的完整定义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; }
}
Run Code Online (Sandbox Code Playgroud)

我希望Dictionary.WebDefinitions在反序列化时可以为空.但是当它发生运行时错误

//runtime error : System.InvalidOperationException
XmlSerializer myXml = new XmlSerializer(typeof(Dictionary), "UOC");
Run Code Online (Sandbox Code Playgroud)

为什么我不能用XmlElementAttribute.IsNullable

注1:

当我删除一行时[XmlElement(IsNullable = true)],它正常工作,没有错误.(序列化和反序列化).

note2:
异常是System.InvalidOperationException,消息是:"error occured in during reflection 'UOC.DicData' type"

谢谢.

Mar*_*ell 6

正如我在评论中指出的那样"特别是InnerException"; 因为你没有添加这个,我运行了样本,最里面的InnerException是:

IsNullable may not be 'true' for value type WebDefinition. Please consider using Nullable<WebDefinition> instead.

我想,这可以告诉你所需要的一切.改变它WebDefinition?(也Nullable<WebDefinition>确实修复它.

但关键点在于:阅读异常和InnerException.

IMO,这里更好的"修复"就是让它成为一个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; }
}
Run Code Online (Sandbox Code Playgroud)