DataContractAttribute Kelas

Definisi

Menentukan bahwa jenis menentukan atau mengimplementasikan kontrak data dan dapat diserialisasikan oleh serializer, seperti DataContractSerializer. Agar jenisnya dapat diserialisasikan, penulis jenis harus menentukan kontrak data untuk jenisnya.

public ref class DataContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)]
public sealed class DataContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)>]
type DataContractAttribute = class
    inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
Warisan
DataContractAttribute
Atribut

Contoh

Contoh berikut menserialisasikan dan mendeserialisasi kelas bernama Person yang DataContractAttribute telah diterapkan. Perhatikan bahwa Namespace properti dan Name telah diatur ke nilai yang mengambil alih pengaturan default.

namespace DataContractAttributeExample
{
    // Set the Name and Namespace properties to new values.
    [DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
    class Person : IExtensibleDataObject
    {
        // To implement the IExtensibleDataObject interface, you must also
        // implement the ExtensionData property.
        private ExtensionDataObject extensionDataObjectValue;
        public ExtensionDataObject ExtensionData
        {
            get
            {
                return extensionDataObjectValue;
            }
            set
            {
                extensionDataObjectValue = value;
            }
        }

        [DataMember(Name = "CustName")]
        internal string Name;

        [DataMember(Name = "CustID")]
        internal int ID;

        public Person(string newName, int newID)
        {
            Name = newName;
            ID = newID;
        }
    }

    class Test
    {
        public static void Main()
        {
            try
            {
                WriteObject("DataContractExample.xml");
                ReadObject("DataContractExample.xml");
                Console.WriteLine("Press Enter to end");
                Console.ReadLine();
            }
            catch (SerializationException se)
            {
                Console.WriteLine
                ("The serialization operation failed. Reason: {0}",
                  se.Message);
                Console.WriteLine(se.Data);
                Console.ReadLine();
            }
        }

        public static void WriteObject(string path)
        {
            // Create a new instance of the Person class and
            // serialize it to an XML file.
            Person p1 = new Person("Mary", 1);
            // Create a new instance of a StreamWriter
            // to read and write the data.
            FileStream fs = new FileStream(path,
            FileMode.Create);
            XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
            DataContractSerializer ser =
                new DataContractSerializer(typeof(Person));
            ser.WriteObject(writer, p1);
            Console.WriteLine("Finished writing object.");
            writer.Close();
            fs.Close();
        }
        public static void ReadObject(string path)
        {
            // Deserialize an instance of the Person class
            // from an XML file. First create an instance of the
            // XmlDictionaryReader.
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
            XmlDictionaryReader reader =
                XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());

            // Create the DataContractSerializer instance.
            DataContractSerializer ser =
                new DataContractSerializer(typeof(Person));

            // Deserialize the data and read it from the instance.
            Person newPerson = (Person)ser.ReadObject(reader);
            Console.WriteLine("Reading this object:");
            Console.WriteLine(String.Format("{0}, ID: {1}",
            newPerson.Name, newPerson.ID));
            fs.Close();
        }
    }
}
Namespace DataContractAttributeExample
    ' Set the Name and Namespace properties to new values.
    <DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")>  _
    Class Person
        Implements IExtensibleDataObject
        ' To implement the IExtensibleDataObject interface, you must also
        ' implement the ExtensionData property.
        Private extensionDataObjectValue As ExtensionDataObject 
        
        Public Property ExtensionData() As ExtensionDataObject _
          Implements IExtensibleDataObject.ExtensionData
            Get
                Return extensionDataObjectValue
            End Get
            Set
                extensionDataObjectValue = value
            End Set
        End Property
        
        <DataMember(Name := "CustName")>  _
        Friend Name As String
        
        <DataMember(Name := "CustID")>  _
        Friend ID As Integer
        
        
        Public Sub New(ByVal newName As String, ByVal newID As Integer) 
            Name = newName
            ID = newID
        
        End Sub 
    End Class 
    
    
    Class Test
        
        Public Shared Sub Main() 
            Try
                WriteObject("DataContractExample.xml")
                ReadObject("DataContractExample.xml")
                Console.WriteLine("Press Enter to end")
                Console.ReadLine()
            Catch se As SerializationException
                Console.WriteLine("The serialization operation failed. Reason: {0}", _
                   se.Message)
                Console.WriteLine(se.Data)
                Console.ReadLine()
            End Try
        
        End Sub 
        
        
        Public Shared Sub WriteObject(ByVal path As String) 
            ' Create a new instance of the Person class and 
            ' serialize it to an XML file.
            Dim p1 As New Person("Mary", 1)
            ' Create a new instance of a StreamWriter
            ' to read and write the data.
            Dim fs As New FileStream(path, FileMode.Create)
            Dim writer As XmlDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(fs)
            Dim ser As New DataContractSerializer(GetType(Person))
            ser.WriteObject(writer, p1)
            Console.WriteLine("Finished writing object.")
            writer.Close()
            fs.Close()
        
        End Sub 
        
        Public Shared Sub ReadObject(ByVal path As String) 
            ' Deserialize an instance of the Person class 
            ' from an XML file. First create an instance of the 
            ' XmlDictionaryReader.
            Dim fs As New FileStream(path, FileMode.OpenOrCreate)
            Dim reader As XmlDictionaryReader = XmlDictionaryReader. _
              CreateTextReader(fs, New XmlDictionaryReaderQuotas())
            
            ' Create the DataContractSerializer instance.
            Dim ser As New DataContractSerializer(GetType(Person))
            
            ' Deserialize the data and read it from the instance.
            Dim newPerson As Person = CType(ser.ReadObject(reader), Person)
            Console.WriteLine("Reading this object:")
            Console.WriteLine(String.Format("{0}, ID: {1}", newPerson.Name, newPerson.ID))
            fs.Close()
        
        End Sub 
    End Class 
End Namespace

Keterangan

Terapkan atribut DataContractAttribute untuk jenis (kelas, struktur, atau enumerasi) yang digunakan dalam operasi serialisasi dan deserialisasi oleh DataContractSerializer. Jika Anda mengirim atau menerima pesan dengan menggunakan infrastruktur Windows Communication Foundation (WCF), Anda juga harus menerapkan DataContractAttribute ke kelas apa pun yang menyimpan dan memanipulasi data yang dikirim dalam pesan. Untuk informasi selengkapnya tentang kontrak data, lihat Menggunakan Kontrak Data.

Anda juga harus menerapkan DataMemberAttribute pada bidang, properti, atau peristiwa apa pun yang menyimpan nilai yang ingin Anda serialkan. Dengan menerapkan DataContractAttribute, Anda secara eksplisit mengaktifkan DataContractSerializer untuk menserialisasikan dan mendeserialisasi data.

Perhatian

Anda dapat menerapkan DataMemberAttribute pada bidang privat. Ketahuilah bahwa data yang dikembalikan oleh bidang (bahkan jika bersifat privat) diserialisasikan dan dideserialisasi, dan dengan demikian dapat dilihat atau disadap oleh pengguna atau proses berbahaya.

Untuk informasi selengkapnya tentang kontrak data, lihat topik yang tercantum dalam Menggunakan Kontrak Data.

Kontrak data

Kontrak data adalah deskripsi abstrak dari sekumpulan bidang dengan nama dan jenis data untuk setiap bidang. Kontrak data ada di luar implementasi tunggal apa pun untuk memungkinkan layanan pada platform yang berbeda beroperasi. Selama data yang diteruskan antara layanan sesuai dengan kontrak yang sama, semua layanan dapat memproses data. Pemrosesan ini juga dikenal sebagai sistem yang digabungkan secara longgar. Kontrak data juga mirip dengan antarmuka di mana kontrak menentukan bagaimana data harus dikirimkan sehingga dapat diproses oleh aplikasi. Misalnya, kontrak data dapat memanggil jenis data bernama "Orang" yang memiliki dua bidang teks, bernama "FirstName" dan "LastName". Untuk membuat kontrak data, terapkan DataContractAttribute ke kelas dan terapkan DataMemberAttribute ke bidang atau properti apa pun yang harus diserialisasikan. Saat diserialisasi, data sesuai dengan kontrak data yang secara implisit terdapat di dalam tipe.

Note

Kontrak data berbeda secara signifikan dari antarmuka aktual dalam perilaku warisannya. Antarmuka diwariskan oleh tipe turunan apa pun. Saat Anda menerapkan DataContractAttribute pada kelas dasar, tipe turunan tidak mewarisi atribut atau perilakunya. Namun, jika jenis turunan memiliki kontrak data, anggota data kelas dasar diserialisasikan. Namun, Anda harus menerapkannya DataMemberAttribute ke anggota baru di kelas turunan supaya bisa diserialisasikan.

Dokumen skema XML dan alat SvcUtil

Jika Anda bertukar data dengan layanan lain, Anda harus menjelaskan kontrak data. Untuk versi saat ini, DataContractSerializerskema XML dapat digunakan untuk menentukan kontrak data. (Bentuk metadata/deskripsi lainnya dapat digunakan untuk tujuan yang sama.) Untuk membuat skema XML dari aplikasi Anda, gunakan ServiceModel Metadata Utility Tool (Svcutil.exe) dengan opsi baris perintah /dconly . Ketika input ke alat adalah rakitan, secara default, alat ini menghasilkan sekumpulan skema XML yang menentukan semua jenis kontrak data yang ditemukan dalam rakitan tersebut. Sebaliknya, Anda juga dapat menggunakan alat Svcutil.exe untuk membuat definisi kelas Visual Basic atau C# yang sesuai dengan persyaratan skema XML yang menggunakan konstruksi yang dapat diekspresikan oleh kontrak data. Dalam hal ini, opsi baris perintah /dconly tidak diperlukan.

Jika input ke alat Svcutil.exe adalah skema XML, secara default, alat ini membuat sekumpulan kelas. Jika Anda memeriksa kelas tersebut, Anda akan menemukan bahwa DataContractAttribute telah diterapkan. Anda dapat menggunakan kelas tersebut untuk membuat aplikasi baru untuk memproses data yang harus ditukar dengan layanan lain.

Anda juga dapat menjalankan alat terhadap titik akhir yang mengembalikan dokumen Web Services Description Language (WSDL) untuk secara otomatis menghasilkan kode dan konfigurasi untuk membuat klien Windows Communication Foundation (WCF). Kode yang dihasilkan mencakup jenis yang ditandai dengan DataContractAttribute.

Gunakan kembali jenis yang sudah ada

Kontrak data memiliki dua persyaratan dasar: nama yang stabil dan daftar anggota. Nama stabil terdiri dari pengidentifikasi sumber daya seragam namespace (URI) dan nama lokal kontrak. Secara default, saat Anda menerapkan DataContractAttribute ke kelas, itu menggunakan nama kelas sebagai nama lokal dan namespace kelas (diawali dengan "http://schemas.datacontract.org/2004/07/") sebagai URI namespace. Anda dapat menggantikan default dengan mengatur properti Name dan Namespace. Anda juga dapat mengubah namespace dengan menerapkan ContractNamespaceAttribute ke namespace. Gunakan kemampuan ini ketika Anda memiliki tipe yang sudah ada yang memproses data dengan cara yang Anda perlukan tetapi memiliki namespace dan nama kelas yang berbeda dari kontrak data. Dengan mengesampingkan nilai default, Anda dapat menggunakan kembali jenis yang ada dan memiliki data berseri sesuai dengan kontrak data.

Note

Dalam kode apa pun, Anda dapat menggunakan kata DataContract alih-alih lebih lama DataContractAttribute.

Pengelolaan Versi

Kontrak data juga dapat mengakomodasi versi yang lebih baru dari dirinya sendiri. Artinya, ketika versi kontrak yang lebih baru menyertakan data tambahan, data tersebut disimpan dan dikembalikan ke pengirim yang tidak tersentuh. Untuk melakukan ini, terapkan IExtensibleDataObject antarmuka.

Untuk informasi selengkapnya tentang penerapan versi, lihat Penerapan Versi Kontrak Data.

Konstruktor

Nama Deskripsi
DataContractAttribute()

Menginisialisasi instans baru dari kelas DataContractAttribute.

Properti

Nama Deskripsi
IsNameSetExplicitly

Mendapatkan apakah Name telah diatur secara eksplisit.

IsNamespaceSetExplicitly

Mendapatkan apakah Namespace telah diatur secara eksplisit.

IsReference

Mendapatkan atau menetapkan nilai yang menunjukkan apakah akan mempertahankan data referensi objek.

IsReferenceSetExplicitly

Mendapatkan apakah IsReference telah diatur secara eksplisit.

Name

Mengambil atau menetapkan nama kontrak data untuk tipe tersebut.

Namespace

Mengambil atau menetapkan namespace untuk kontrak data untuk tipe tersebut.

TypeId

Ketika diimplementasikan dalam kelas turunan, mendapatkan pengidentifikasi unik untuk Attributeini.

(Diperoleh dari Attribute)

Metode

Nama Deskripsi
Equals(Object)

Mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
GetHashCode()

Mengembalikan kode hash untuk instans ini.

(Diperoleh dari Attribute)
GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
IsDefaultAttribute()

Ketika ditimpa dalam kelas turunan, menunjukkan apakah nilai instans ini adalah nilai default untuk kelas turunan.

(Diperoleh dari Attribute)
Match(Object)

Saat ditimpa dalam kelas turunan, mengembalikan nilai yang menunjukkan apakah instans ini sama dengan objek tertentu.

(Diperoleh dari Attribute)
MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Implementasi Antarmuka Eksplisit

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

Memetakan sekumpulan nama ke sekumpulan pengidentifikasi pengiriman yang sesuai.

(Diperoleh dari Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Mengambil informasi jenis untuk objek, yang dapat digunakan untuk mendapatkan informasi jenis untuk antarmuka.

(Diperoleh dari Attribute)
_Attribute.GetTypeInfoCount(UInt32)

Mengambil jumlah antarmuka informasi jenis yang disediakan objek (baik 0 atau 1).

(Diperoleh dari Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Menyediakan akses ke properti dan metode yang diekspos oleh objek.

(Diperoleh dari Attribute)

Berlaku untuk

Lihat juga