原文地址:點擊打開鏈接
DataContractSerializer 類
使用提供的數據協定,將類型實例序列化和反序列化為 XML 流或文檔。 無法繼承此類。
命名空間: System.Runtime.Serialization
. dll 中)
備註
使用DataContractSerializer 類別可以將類型實例序列化和反序列化為XML 流或文件。 透過將 DataContractAttribute 特性套用至類別,而將DataMemberAttribute 特性套用至類別成員,可以指定要序列化的屬性和欄位。
字面意思來理解就是:資料契約序列化,本文主要講解用DataContractSerializer 序列化與反序列化.
//------------------------------------------------------------ // 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特性的屬性/欄位才屬於資料契約的成員。
//------------------------------------------------------------
// 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)!