首頁 > 後端開發 > C#.Net教程 > C# WCF DataContractSerializer 類別

C# WCF DataContractSerializer 類別

黄舟
發布: 2017-02-15 11:28:38
原創
1451 人瀏覽過

     原文地址:點擊打開鏈接 

     DataContractSerializer 類

     使用提供的數據協定,將類型實例序列化和反序列化為 XML 流或文檔。 無法繼承此類。

     命名空間:  System.Runtime.Serialization  

 . dll 中)

備註

使用DataContractSerializer 類別可以將類型實例序列化和反序列化為XML 流或文件。 透過將 DataContractAttribute 特性套用至類別,而將DataMemberAttribute 特性套用至類別成員,可以指定要序列化的屬性和欄位。

      字面意思來理解就是:資料契約序列化,本文主要講解用DataContractSerializer 序列化與反序列化.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

//------------------------------------------------------------

// Copyright (c) Microsoft Corporation.  All rights reserved.

//------------------------------------------------------------

  

namespace System.Runtime.Serialization

{

    // 摘要:

    //     指定该类型要定义或实现一个数据协定,并可由序列化程序(如 System.Runtime.Serialization.DataContractSerializer)进行序列化。

    //     若要使其类型可序列化,类型作者必须为其类型定义数据协定。

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum, Inherited = false, AllowMultiple = false)]

    public sealed class DataContractAttribute : Attribute

    {

        string name;

        string ns;

        bool isNameSetExplicitly;

        bool isNamespaceSetExplicitly;

        bool isReference;

        bool isReferenceSetExplicitly;

        // 摘要:

        //     初始化 System.Runtime.Serialization.DataContractAttribute 类的新实例。

        public DataContractAttribute()

        {

        }

         // 摘要:

         //     获取或设置一个值,该值指示是否保留对象引用数据。

         //

         // 返回结果:

         //     如果使用标准 XML 保留对象引用数据,则为 true;否则为 false。 默认值为 false。

        public bool IsReference

        {

            get { return isReference; }

            set

            {

                isReference = value;

                isReferenceSetExplicitly = true;

            }

        }

     

        public bool IsReferenceSetExplicitly

        {

            get { return isReferenceSetExplicitly; }

        }

  

        //

         // 摘要:

         //     获取或设置类型的数据协定的命名空间。

         //

         // 返回结果:

         //     协定的命名空间。

        public string Namespace

        {

            get { return ns; }

            set

            {

                ns = value;

                isNamespaceSetExplicitly = true;

            }

        }

  

        public bool IsNamespaceSetExplicitly

        {

            get { return isNamespaceSetExplicitly; }

        }

  

        //

        // 摘要:

        //     获取或设置类型的数据协定的名称。

        //

        // 返回结果:

        //     数据协定的本地名称。 默认值是应用了该属性的类的名称。

        public string Name

        {

            get { return name; }

            set

            {

                name = value;

                isNameSetExplicitly = true;

            }

        }

  

        public bool IsNameSetExplicitly

        {

            get { return isNameSetExplicitly; }

        }

  

    }

}

登入後複製

DataContractAttribute從應用在DataContractAttribute上的AttributeUsageAttribute特性看,該特性只能用於枚舉、類別、結構體而不能應用於接口,從關鍵字sealed知道DataContractAttribute是不可被繼承的。 AllowMutiple屬性為False,表示一個資料型別上只能套用一個DataContractAttribute特性。

      從上面對DataContractAttribute定義看出DataContractAttribute僅包含5個屬性成員,其中Name和Namespace表示資料契約的名稱和命名空間,IsReference表示在進行序列化的時候是否保持物件現有的引用結構,該屬性預設值為False。


       資料契約成員採用顯示選擇機制,也就是說,應用了DataContractAttribute特性的資料類型的屬性/欄位不會自動產生契約的資料成員,而只有那些應用了DataMemberAttribute特性的屬性/欄位才屬於資料契約的成員。





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

//------------------------------------------------------------

// Copyright (c) Microsoft Corporation.  All rights reserved.

//------------------------------------------------------------

  

namespace System.Runtime.Serialization

{

     // 摘要:

     //     当应用于类型的成员时,指定该成员是数据协定的一部分并可由 System.Runtime.Serialization.DataContractSerializer

     //     进行序列化。

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, Inherited = false, AllowMultiple = false)]

    public sealed class DataMemberAttribute : Attribute

    {

        string name;

        bool isNameSetExplicitly;

        int order = -1;

        bool isRequired;

        bool emitDefaultValue = Globals.DefaultEmitDefaultValue;

  

         // 摘要:

         //     初始化 System.Runtime.Serialization.DataMemberAttribute 类的新实例。

        public DataMemberAttribute()

        {

        }

  

        //

        // 摘要:

        //     获取或设置数据成员名称。

        //

        // 返回结果:

        //     该数据成员的名称。 默认值是应用该属性的目标的名称。

        public string Name

        {

            get { return name; }

            set { name = value; isNameSetExplicitly = true; }

        }

  

        public bool IsNameSetExplicitly

        {

            get { return isNameSetExplicitly; }

        }

  

         //

         // 摘要:

         //     获取或设置成员的序列化和反序列化的顺序。

         //

         // 返回结果:

         //     序列化或反序列化的数字顺序。

        public int Order

        {

            get { return order; }

            set

            {

                if (value < 0)

                    throw System.Runtime.Serialization.DiagnosticUtility.ExceptionUtility.ThrowHelperError(new InvalidDataContractException(SR.GetString(SR.OrderCannotBeNegative)));

                order = value;

            }

        }

        // 摘要:

         //     获取或设置一个值,该值用于指示序列化引擎在读取或反序列化时成员必须存在。

         //

         // 返回结果:

         //     如果该成员是必需的,则为 true;否则为 false。

         //

         // 异常:

         //   System.Runtime.Serialization.SerializationException:

         //     该成员不存在。

        public bool IsRequired

        {

            get { return isRequired; }

            set { isRequired = value; }

        }

  

        // 摘要:

        //     获取或设置一个值,该值指定是否对正在被序列化的字段或属性的默认值进行序列化。

        //

        // 返回结果:

        //     如果应该在序列化流中生成成员的默认值,则为 true;否则为 false。 默认值为 true。

        public bool EmitDefaultValue

        {

            get { return emitDefaultValue; }

            set { emitDefaultValue = value; }

        }

    }

}

登入後複製

DataMemberAttribute

      從上面應用在DataMemberAttribute上的因為只有這兩種元素才是「數據」成員。 4個屬性分別表示如下的意義。

 Name:資料成員的名稱,預設為欄位或屬性的名稱。


 Order:對應的資料成員在最終序列化的XML中出現的位置,Order值越小越考前,預設值為-1.

  • IsRequired:顯示屬性成員是否是必須的成員。預設值為false,表示該成員是可以缺省的。

  • EmitDefaultValue :取得或設定一個值,該值指定是否對正在被序列化的欄位或屬性的預設值進行序列化。如果應該在序列化流中產生成員的預設值,則為 true;否則為 false。 預設值為 true。

  • 原始碼來源:點擊開啟連結

以上就是C# WCF DataContractSerializer 類別的內容,更多相關內容請關注PHP中文網(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板