程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 讓.NET xml序列化支持Nullable,序列化nullable

讓.NET xml序列化支持Nullable,序列化nullable

編輯:C#入門知識

讓.NET xml序列化支持Nullable,序列化nullable


.NET的序列化,關於契約類的生成我們都是通過xsd.exe,對於值類型的可空判斷是通過聲明同名+Specified的bool屬性來判斷,比如:

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

        public int Age
        {
            get;
            set;
        }

     [XmlIgnore] public bool AgeSpecified { get; set; } }

這樣,當想生成Age節點,除了給Age賦值外還需要設置AgeSpecified=true。而反序列化時,則可以通過判斷AgeSpecified是否為true來知道Age屬性是否有被賦值。嗯,雖然麻煩點,但能夠解決問題,挺不錯,而且這還是xsd給我們生成的,省事。但如果你希望Person類即要支持xml序列化也支持json序列化呢?你該如何處理這個Specified字段?

有人該問了,為何不直接定義Age為可空類型?您可以試試,序列化出來的xml如下:

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>name</Name>
  <Age xsi:nil="true" />
</Person>

Age屬性我是沒有賦值的,但卻生成了Age xsi。。。這樣一個奇葩節點。

 

今天網上閒逛,偶然發現竟然可以這樣:

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

        public int? Age
        {
            get;
            set;
        }

        public bool ShouldSerializeAge()
        {
            return Age != null;
        }
    }

竟然有ShouldSerialize特性,如果能夠集成進xsd就好了,不然為了支持nullable,所有值類型都這麼搞一次也挺累的。

https://msdn.microsoft.com/en-us/library/53b8022e(v=vs.110).aspx

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved