簡體   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