DataMemberAttribute 类

定义

当应用于类型的成员时,指定该成员是数据协定的一部分并可由 DataContractSerializer 进行序列化。When applied to the member of a type, specifies that the member is part of a data contract and is serializable by the DataContractSerializer.

public ref class DataMemberAttribute sealed : Attribute
public sealed class DataMemberAttribute : Attribute
[System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple=false, Inherited=false)]
public sealed class DataMemberAttribute : Attribute
type DataMemberAttribute = class
    inherit Attribute
[<System.AttributeUsage(System.AttributeTargets.Field | System.AttributeTargets.Property, AllowMultiple=false, Inherited=false)>]
type DataMemberAttribute = class
    inherit Attribute
Public NotInheritable Class DataMemberAttribute
Inherits Attribute
继承
DataMemberAttribute
属性

示例

下面的示例演示了 DataContractAttributeDataMemberAttribute 特性应用于的类型。The following example shows a type to which the DataContractAttribute and DataMemberAttribute attributes have been applied. Name上的属性 DataMemberAttribute 设置为 "ID"。The Name property on the DataMemberAttribute is set to "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 来标识类型的属于数据协定的成员。Apply the DataMemberAttribute attribute in conjunction with the DataContractAttribute to identify members of a type that are part of a data contract. 可以序列化数据协定的序列化程序之一是 DataContractSerializerOne of the serializers that can serialize data contracts is the DataContractSerializer.

该数据协定模型是一种“选择性加入”模型。The data contract model is an "opt-in" model. DataMemberAttribute 应用于字段或属性将显式指定要序列化成员值。Applying the DataMemberAttribute to a field or property explicitly specifies that the member value will be serialized. 与此相反,BinaryFormatter 序列化类型的公共字段和私有字段,而 XmlSerializer 仅序列化类型的公共字段和属性。In contrast, the BinaryFormatter serializes public and private fields of a type, and the XmlSerializer serializes only public fields and properties of a type.

注意

可将 DataMemberAttribute 应用于私有字段或属性。You can apply the DataMemberAttribute to private fields or properties. 请注意,由于成员返回的数据将被序列化和反序列化,因此该成员返回的数据) (,因此可能会被恶意用户或进程查看或截取。Be aware that the data returned by the member (even if it's private) will be serialized and deserialized, and thus can be viewed or intercepted by a malicious user or process.

默认情况下,将 CLR 成员名称用作数据成员的名称。By default, the CLR member name is used as the name of the data member. 可以通过设置 Name 属性来自定义数据成员的名称。By setting the Name property, you can customize the name of the data member. 这可用于提供一个不允许作为 CLR 成员名称的名称。This can be used to provide a name that may not be allowed as a CLR member name. 当使用 DataContractSerializer 映射到 XML 时,此名称用作类型中的架构元素的名称。When mapping to XML using the DataContractSerializer, this name is used as the name of the schema element in a type.

备注

DataMemberAttribute特性已应用到的属性必须同时具有 getset 字段。Properties to which the DataMemberAttribute attribute has been applied must have both get and set fields. 它们不能为 get -only 或 set -only。They cannot be get-only or set-only. 若要序列化应 get 仅由设计 (的属性(例如,返回) 集合的属性),请考虑 DataMemberAttribute 改为将应用到支持字段。To serialize a property that should remain get-only by design (for example, a property that returns a collection), consider applying the DataMemberAttribute to the backing field instead.

有关数据协定和数据成员的详细信息,请参阅 使用数据协定For more information about data contracts and data members, see Using Data Contracts. 有关成员名称的详细信息,请参阅 数据成员默认值For more information about member names, see Data Member Default Values.

构造函数

DataMemberAttribute()

初始化 DataMemberAttribute 类的新实例。Initializes a new instance of the DataMemberAttribute class.

属性

EmitDefaultValue

获取或设置一个值,该值指定是否序列化正在序列化的字段或属性的默认值。Gets or sets a value that specifies whether to serialize the default value for a field or property being serialized.

IsNameSetExplicitly

获取 Name 是否已显式设置。Gets whether Name has been explicitly set.

IsRequired

获取或设置一个值,该值指示序列化引擎该成员在读取或反序列化时必须存在。Gets or sets a value that instructs the serialization engine that the member must be present when reading or deserializing.

Name

获取或设置数据成员名称。Gets or sets a data member name.

Order

获取或设置成员的序列化和反序列化的顺序。Gets or sets the order of serialization and deserialization of a member.

TypeId

在派生类中实现时,获取此 Attribute 的唯一标识符。When implemented in a derived class, gets a unique identifier for this Attribute.

(继承自 Attribute)

方法

Equals(Object)

返回一个值,该值指示此实例是否与指定的对象相等。Returns a value that indicates whether this instance is equal to a specified object.

(继承自 Attribute)
GetHashCode()

返回此实例的哈希代码。Returns the hash code for this instance.

(继承自 Attribute)
GetType()

获取当前实例的 TypeGets the Type of the current instance.

(继承自 Object)
IsDefaultAttribute()

在派生类中重写时,指示此实例的值是否是派生类的默认值。When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(继承自 Attribute)
Match(Object)

当在派生类中重写时,返回一个指示此实例是否等于指定对象的值。When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(继承自 Attribute)
MemberwiseClone()

创建当前 Object 的浅表副本。Creates a shallow copy of the current Object.

(继承自 Object)
ToString()

返回表示当前对象的字符串。Returns a string that represents the current object.

(继承自 Object)

显式接口实现

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

将一组名称映射为对应的一组调度标识符。Maps a set of names to a corresponding set of dispatch identifiers.

(继承自 Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

检索对象的类型信息,然后可以使用该信息获取接口的类型信息。Retrieves the type information for an object, which can be used to get the type information for an interface.

(继承自 Attribute)
_Attribute.GetTypeInfoCount(UInt32)

检索对象提供的类型信息接口的数量(0 或 1)。Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(继承自 Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

提供对某一对象公开的属性和方法的访问。Provides access to properties and methods exposed by an object.

(继承自 Attribute)

适用于

另请参阅