DataMemberAttribute 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
當套用至型別的成員時,便會指定該成員屬於資料合約的一部分,而且已由 DataContractSerializer 完成序列化。
public ref class DataMemberAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
public sealed class DataMemberAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple=false, Inherited=false)>]
type DataMemberAttribute = class
inherit Attribute
Public NotInheritable Class DataMemberAttribute
Inherits Attribute
- 繼承
- 屬性
範例
下列範例顯示 DataContractAttribute 已套用 和 DataMemberAttribute 屬性的類型。 Name上的 DataMemberAttribute 屬性設定為 「ID」。
using System;
using System.Collections;
using System.IO;
using System.Runtime.Serialization;
using System.Xml;
// You must apply a DataContractAttribute or SerializableAttribute
// to a class to have it serialized by the DataContractSerializer.
[DataContract()]
class Person : IExtensibleDataObject
{
private string LastNameValue;
// Apply the DataMemberAttribute to fields (or properties)
// that must be serialized.
[DataMember()]
public string FirstName;
[DataMember]
public string LastName
{
get { return LastNameValue; }
set { LastNameValue = value; }
}
[DataMember(Name = "ID")]
public int IdNumber;
// Note that you can apply the DataMemberAttribute to
// a private field as well.
[DataMember]
private string Secret;
public Person(string newfName, string newLName, int newIdNumber)
{
FirstName = newfName;
LastName = newLName;
IdNumber = newIdNumber;
Secret = newfName + newLName + newIdNumber;
}
// The extensionDataValue field holds data from future versions
// of the type. This enables this type to be compatible with
// future versions. The field is required to implement the
// IExtensibleDataObject interface.
private ExtensionDataObject extensionDatavalue;
public ExtensionDataObject ExtensionData
{
get
{
return extensionDatavalue;
}
set
{
extensionDatavalue = value;
}
}
}
public class Test
{
public static void Main(string[] args)
{
try
{
WriteObject(@"DataMemberAttributeExample.xml");
ReadObject(@"DataMemberAttributeExample.xml");
}
catch (Exception exc)
{
Console.WriteLine(
"The serialization operation failed: {0} StackTrace: {1}",
exc.Message, exc.StackTrace);
}
finally
{
Console.WriteLine("Press <Enter> to exit....");
Console.ReadLine();
}
}
public static void WriteObject(string filename)
{
// Create a new instance of the Person class.
Person p1 = new Person("Zighetti", "Barbara", 101);
FileStream writer = new FileStream(filename,
FileMode.OpenOrCreate);
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
ser.WriteObject(writer, p1);
writer.Close();
}
public static void ReadObject(string filename)
{
// Deserialize an instance of the Person class
// from an XML file.
FileStream fs = new FileStream(filename,
FileMode.OpenOrCreate);
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
// Deserialize the data and read it from the instance.
Person deserializedPerson = (Person)ser.ReadObject(fs);
fs.Close();
Console.WriteLine(String.Format("{0} {1}, ID: {2}",
deserializedPerson.FirstName, deserializedPerson.LastName,
deserializedPerson.IdNumber));
}
}
Imports System.Collections
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Xml
' You must apply a DataContractAttribute or SerializableAttribute
' to a class to have it serialized by the DataContractSerializer.
<DataContract()> _
Class Person
Implements IExtensibleDataObject
Private LastNameValue As String
' Apply the DataMemberAttribute to fields (or properties)
' that must be serialized.
<DataMember()> _
Public FirstName As String
<DataMember()> _
Public Property LastName() As String
Get
Return LastNameValue
End Get
Set(ByVal Value As String)
LastNameValue = Value
End Set
End Property
<DataMember(Name:="ID")> _
Public IdNumber As Integer
' Note that you can apply the DataMemberAttribute to
' a private field as well.
<DataMember()> _
Private Secret As String
Public Sub New(ByVal newfName As String, ByVal newLName As String, ByVal newIdNumber As Integer)
FirstName = newfName
LastName = newLName
IdNumber = newIdNumber
Secret = newfName + newLName + newIdNumber.ToString()
End Sub
' The ExtensionData field holds data from future versions
' of the type. This enables this type to be compatible with
' future versions. The field is required to implement the
' IExtensibleObjectData interface.
Private extensionDataValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return extensionDataValue
End Get
Set
extensionDataValue = value
End Set
End Property
End Class
Public Class Test
Public Shared Sub Main(ByVal args() As String)
Try
ReadObject("DataMemberAttributeExample.xml")
WriteObject("DataMemberAttributeExample.xml")
Catch exc As Exception
Console.WriteLine("The serialization operation failed: {0} StackTrace: {1}", _
exc.Message, exc.StackTrace)
Finally
Console.WriteLine("Press <Enter> to exit....")
Console.ReadLine()
End Try
End Sub
Public Shared Sub ReadObject(ByVal filename As String)
' Create a new instance of the Person class.
Dim p1 As New Person("Zighetti", "Barbara", 101)
Dim writer As New FileStream(filename, FileMode.Create)
Dim ser As New DataContractSerializer(GetType(Person))
ser.WriteObject(writer, p1)
writer.Close()
End Sub
Public Shared Sub WriteObject(ByVal filename As String)
' Deserialize an instance of the Person class
' from an XML file.
Dim fs As New FileStream(filename, FileMode.OpenOrCreate)
Dim ser As New DataContractSerializer(getTYpe(Person))
' Deserialize the data and read it from the instance.
Dim deserializedPerson As Person = ser.ReadObject(fs)
fs.Close()
Console.WriteLine(String.Format("{0} {1}, ID: {2}", _
deserializedPerson.FirstName, deserializedPerson.LastName, deserializedPerson.IdNumber))
End Sub
End Class
備註
搭配 DataMemberAttribute 來套用 DataContractAttribute 屬性,便可識別屬於資料合約一部分的型別成員。 能夠序列化資料合約的其中一個序列化程式是 DataContractSerializer。
資料合約模型是 Opt-In 模型。 將 DataMemberAttribute 套用至欄位或屬性,即可明確地指定該成員值將要加以序列化。 相反地,會將 XmlSerializer 類型的所有公用字段和屬性串行化。
警告
您可以將 DataMemberAttribute 套用至私用欄位或屬性。 請注意,成員所傳回的數據 (即使其為私用) 也會串行化和還原串行化,因此可由惡意使用者或進程檢視或攔截。
根據預設,CLR 成員名稱會用來當做資料成員的名稱。 透過設定 Name 屬性,您就可以自訂資料成員的名稱。 這種做法可以用來提供不允許當做 CLR 成員名稱的名稱。 當使用 DataContractSerializer 來對應至 XML 時,這個名稱會用來當做型別中的結構描述項目名稱。
注意
DataMemberAttribute已套用屬性的屬性必須同時get
具有 和 set
欄位。 它們不可以是 get
-only 或 set
-only。 例如,若要串行化應該保留 get
的屬性 (,例如傳回集合) 的屬性,請考慮改為將 套用 DataMemberAttribute 至支援字段。
如需數據合約和數據成員的詳細資訊,請參閱 使用數據合約。 如需成員名稱的詳細資訊,請參閱 數據成員預設值。
建構函式
DataMemberAttribute() |
初始化 DataMemberAttribute 類別的新執行個體。 |
屬性
EmitDefaultValue |
取得或設定值,這個值會指定即將序列化之欄位或屬性的預設值是否要加以序列化。 |
IsNameSetExplicitly |
確認是否已明確設定 Name。 |
IsRequired |
取得或設定值,這個值會指示序列化引擎在讀取或還原序列化時成員是否必須存在於其中。 |
Name |
取得或設定資料成員名稱。 |
Order |
取得或設定成員之序列化和還原序列化的順序。 |
TypeId |
在衍生類別中實作時,取得這個 Attribute 的唯一識別碼。 (繼承來源 Attribute) |
方法
Equals(Object) |
傳回值,這個值指出此執行個體是否與指定的物件相等。 (繼承來源 Attribute) |
GetHashCode() |
傳回這個執行個體的雜湊碼。 (繼承來源 Attribute) |
GetType() |
取得目前執行個體的 Type。 (繼承來源 Object) |
IsDefaultAttribute() |
在衍生類別中覆寫時,表示這個執行個體的值是衍生類別的預設值。 (繼承來源 Attribute) |
Match(Object) |
在衍生類別中覆寫時,會傳回值,表示這個執行個體是否等於指定物件。 (繼承來源 Attribute) |
MemberwiseClone() |
建立目前 Object 的淺層複製。 (繼承來源 Object) |
ToString() |
傳回代表目前物件的字串。 (繼承來源 Object) |
明確介面實作
_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
將一組名稱對應至一組對應的分派識別項 (Dispatch Identifier)。 (繼承來源 Attribute) |
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
擷取物件的類型資訊,可以用來取得介面的類型資訊。 (繼承來源 Attribute) |
_Attribute.GetTypeInfoCount(UInt32) |
擷取物件提供的類型資訊介面數目 (0 或 1)。 (繼承來源 Attribute) |
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
提供物件所公開的屬性和方法的存取權。 (繼承來源 Attribute) |