繁体   English   中英

XML反序列化C#时设置默认值

[英]Set default value while XML Deserialization C#

考虑下面的类

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

使用 XML 文件中的一些值序列化此 Person 类(名称和年龄)并反序列化返回。 我想在反序列化时 Name 值为 Null 或 Empty 时分配一些默认值。 我试过如下,但它不工作。

public class Person
{
    private string _name;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            if (_name == null)
            {
                _name = "Some Name";
            }
        }
    }
}

使用 XmlSerializer 反序列化 C# 对象时如何设置 string 和 int 字段的默认值。

问题是您已经将默认值的逻辑放在了 setter 中,并且没有被调用,因为在您反序列化的 XML 中没有相关数据。

XmlSerializer反序列化时,它会首先调用构造函数,然后设置值。 因此,如果您想设置默认值,请在构造函数中进行。 任何你有反序列化值的东西都会被应用到它上面,那些你没有的东西仍然会有默认值。

public class Person 
{
    public Person() 
    {
        Name = "Default Name";
    }

    public string Name { get; set; }
}

您必须在Contructor内部初始化property ,如Own Pauling

或者你可以像这样auto-initialize

public class Person{
public string Name { get; set; } = "Some name"
public int Age { get; set; } = 18
}

在您的代码演示中。

当您在Deserialization之前将某些内容(任何内容,甚至null )设置为property时,它才起作用。

由于其他答案也建议默认值应解释为由默认构造函数分配给属性的值。

如果你想要一个 XML 序列化器,它可以考虑默认值(不会序列化具有默认值的属性)你可以试试这个(免责声明:由我编写)。

因此,您可以按如下方式定义Person类。

public class Person
{
    [DefaultValue("Some Name")]
    public string Name { get; set; } = "Some Name";

    [DefaultValue(50)]
    public int Age { get; set; } = 50;
}

在这里看到一个活生生的例子。 这些库在NuGet上可用。 它支持 Linq2Xml ( XElement ) 和常规XmlWriter

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM