【问题标题】:DeSerialize XML into Class, Subclass & Properties making SubClass not null将 XML 反序列化为类、子类和属性,使子类不为空
【发布时间】:2009-10-19 12:06:58
【问题描述】:

我有一些我正在反序列化的 XML,除了我在序列化类中的一个属性也是一个类之外,所有的工作都很好;人员.地址.邮政编码。

Address 是 Person 类中的一个属性,而 Address 是一个具有 Postcode 等属性的类。

如果传入的 XML 不包含地址信息,并且在我查看 Person.Address 时发生反序列化,则为 null。

我希望 Person.Address 不为空,并且 Postcode 不为空但为空字符串。

我已尝试在 Address 属性上设置 IsNullable=false 属性,但这不起作用。

这怎么可能?

【问题讨论】:

    标签: c# xml xml-serialization


    【解决方案1】:

    您可以将 Postcode 设置为一个属性,如果未设置则返回 String.Empty,否则返回值。或者使它不可能在 set 块中设置为 null。此外,您可以通过将其制成结构来使 Address 不可能为空。在这种情况下,您可以在无参数构造函数中将 Postcode 设置为 String.Empty。或者你可以让你的类实现 IDeserializationCallback 并在 OnDeserialization 方法中使你的地址成为你需要的任何东西。

    private string _postcode;
    public string Postcode 
    {
        get
        {
            return  _postcode ?? String.Empty;
        }
        set
        {
            _postcode = value;
        }
    }
    

    private string _postcode = String.Empty;
    public string Postcode 
    {
        get
        {
            return  _postcode;
        }
        set
        {
            _postcode = value ?? String.Empty;
        }
    }
    

    我发现第一个选项更好,因为即使 Address 类中的某些内容将其设置为 null,它也永远不会返回 null。

    【讨论】:

    • 我怎样才能巧妙地将 Postcode 属性(如下)修改为您建议的内容 public string Info { get;放; }
    【解决方案2】:

    如果您使用 DataContract,只需在某些方法上使用 OnDesrialized 属性(或 OnDeserializing 或任何您喜欢的),在其中指定您想要发生的事情。

    【讨论】:

    • 没有办法用 XmlSerializer 实现这个功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多