【问题标题】:Is there a way to avoid the XmlSerializer to not initialize a null property when deserializing?有没有办法避免 XmlSerializer 在反序列化时不初始化 null 属性?
【发布时间】:2011-01-12 09:59:25
【问题描述】:

我有这门课:

public class MySerializableClass
{
    public List<MyObject> MyList { get; set; }
}

如果 MyList 在 MySerializableClass 被序列化时为空,我也需要在反序列化时将其设为空,但 XmlSerializer 在反序列化我的类时总是将其初始化。

有没有办法避免它初始化空属性?

MyList 为 null 时甚至不会记录在序列化文件中。当我用空值加载它并再次保存时,MyList 不再为空,它被序列化为具有 0 个项目但不为空的 List。

谢谢。

更多信息:

由于类结构中的一些代码限制,IsDeserializing 属性不可行

【问题讨论】:

  • 哇,System.Xml 从来没有让我感到惊讶。有一个集合类成员的公共设置器是非常不寻常的,请检查您的设计以验证这是您真正想要的。没有 setter 也能正常工作。
  • 这不是我真正想要的。这是序列化程序想要的。如果我将 get 或 set 设为私有,则反序列化器将失败。

标签: .net xmlserializer


【解决方案1】:

这看起来像一个错误......

即使您尝试将属性标记为可为空,它似乎也不起作用。

[XmlArray(IsNullable = true)]
public List<MyObject> MyList { get; set; }

它将 MyList 属性序列化如下:

<MyList xsi:nil="true" />

所以xml明明表明list为null,但是反序列化后还是初始化为空list...

如果您将List&lt;MyObject&gt; 替换为MyObject[],它可以正常工作(即使没有IsNullable = true),但它可能不是您想要的......

您应该在Connect 上报告此问题。

【讨论】:

【解决方案2】:

如果您需要空值,请不要使用自动实现的属性。 使用例如

public class MySerializableClass 
{ 
    List<MyObject> myList 
    public List<MyObject> MyList { get {return myList;} set {myList = value;} } 
} 

【讨论】:

  • 不能解决问题,试试吧。
  • 是的,我其实是这样的,我为示例简化了它,但感谢您的建议。
【解决方案3】:

我遇到了同样的问题,但是将 XmlArrayAttribute 添加到没有设置任何内容的属性使其对我有用

public class MySerializableClass
{
    [XmlArray]
    public List<MyObject> MyList { get; set; }
}

【讨论】:

    【解决方案4】:

    如果您添加名称为 *PropertyName* 的属性指定为布尔值,则 XmlSerializer 将仅在为 true 时呈现列表的标记。

    例子:

    public class MySerializableClass
    {
        public List<MyObject> MyList { get; set; }
    
        [XmlIgnore]
        public bool MyListSpecified { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多