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

pinkon5k  于 2023-06-25  发布在  .NET
关注(0)|答案(4)|浏览(268)

考虑下面的类

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

用XML文件中的某个值序列化这个Person类(Name & Age),并反序列化返回。我想在反序列化时,当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#对象时设置字符串和int字段的默认值。

vulvrdjw

vulvrdjw1#

问题是您已经在setter中放置了默认值的逻辑,但它没有被调用,因为在您要反序列化的XML中没有与此相关的数据。
XmlSerializer反序列化时,它将首先调用构造函数,然后设置值。所以如果你想设置默认值,请在构造函数中执行。任何有反序列化值的东西都将被应用到它上,而那些没有反序列化的东西仍然会有默认值。

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

    public string Name { get; set; }
}
w7t8yxp5

w7t8yxp52#

其他答案也建议默认值应该解释为默认构造函数赋予属性的值。
如果您想要一个XML序列化程序,它可以考虑默认值(不会使用默认值序列化属性),您可以尝试this one(免责声明:我写的)。
因此,您可以如下定义Person类。

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

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

请参见here一个活生生的例子。这些库在NuGet上可用。它同时支持Linq2Xml(XElement)和常规XmlWriter

k5hmc34c

k5hmc34c3#

您必须在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时,它只是工作。

cedebl8k

cedebl8k4#

您可以像这样设置默认值

private string _name;
public string Name
{
    get => _name ?? "Default Value";
    set => _name = value;
}

相关问题