【问题标题】:Set default value while XML Deserialization C#在 XML 反序列化 C# 时设置默认值
【发布时间】:2019-12-18 10:06:19
【问题描述】:

考虑下面的类

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# 对象时如何设置字符串和 int 字段的默认值。

【问题讨论】:

  • 也许可以阅读“缩进”
  • 这怎么“不工作”?
  • 虽然反序列化名称值将为空..因此不调用 Set..

标签: c# .net xml


【解决方案1】:

您必须在 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 时,它才会起作用。

【讨论】:

    【解决方案2】:

    问题是您已将默认值的逻辑放入您的设置器中,并且没有被调用,因为您正在反序列化的 XML 中没有此数据。

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

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

    【讨论】:

      【解决方案3】:

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

      如果你想要一个 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 1970-01-01
        相关资源
        最近更新 更多