Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Kontrak data adalah perjanjian formal antara layanan dan klien yang secara abstrak menjelaskan data yang akan ditukar. Artinya, untuk berkomunikasi, klien dan layanan tidak perlu berbagi jenis yang sama, hanya kontrak data yang sama. Kontrak data secara tepat mendefinisikan, untuk setiap parameter atau jenis pengembalian, data apa yang diserialisasikan (diubah menjadi XML) untuk ditukar.
Dasar-Dasar Kontrak Data
Windows Communication Foundation (WCF) menggunakan mesin serialisasi yang disebut Serializer Kontrak Data secara default untuk menserialisasikan dan mendeserialisasi data (mengonversinya ke dan dari XML). Semua jenis primitif .NET Framework, seperti bilangan bulat dan string, serta jenis tertentu yang diperlakukan sebagai primitif, seperti DateTime dan XmlElement, dapat diserialisasikan tanpa persiapan lain dan dianggap memiliki kontrak data default. Banyak jenis .NET Framework juga memiliki kontrak data yang ada. Untuk daftar lengkap jenis yang dapat diserialisasikan, lihat Jenis yang Didukung oleh Serializer Kontrak Data.
Jenis kompleks baru yang Anda buat harus memiliki kontrak data yang ditentukan agar dapat diserialisasikan. Secara bawaan, DataContractSerializer akan menginferensi kontrak data dan menserialisasikan semua jenis yang terlihat oleh publik. Semua properti baca/tulis publik dan lapangan dari jenis tersebut akan diserialisasikan. Anda dapat menolak anggota dari serialisasi dengan menggunakan IgnoreDataMemberAttribute. Anda juga dapat secara eksplisit membuat kontrak data dengan menggunakan DataContractAttribute atribut dan DataMemberAttribute . Ini biasanya dilakukan dengan menerapkan atribut DataContractAttribute ke tipe. Atribut ini dapat diterapkan ke kelas, struktur, dan enumerasi. Atribut DataMemberAttribute kemudian harus diterapkan ke setiap anggota jenis kontrak data untuk menunjukkan bahwa itu adalah anggota data, yaitu, itu harus diserialisasikan. Untuk informasi selengkapnya, lihat Jenis yang Dapat Diserialisasikan.
Contoh
Contoh berikut menunjukkan kontrak layanan (antarmuka) tempat ServiceContractAttribute atribut dan OperationContractAttribute telah diterapkan secara eksplisit. Contoh menunjukkan bahwa jenis primitif tidak memerlukan kontrak data, sementara jenis kompleks tidak.
[ServiceContract]
public interface ISampleInterface
{
// No data contract is required since both the parameter
// and return types are primitive types.
[OperationContract]
double SquareRoot(int root);
// No Data Contract required because both parameter and return
// types are marked with the SerializableAttribute attribute.
[OperationContract]
System.Drawing.Bitmap GetPicture(System.Uri pictureUri);
// The MyTypes.PurchaseOrder is a complex type, and thus
// requires a data contract.
[OperationContract]
bool ApprovePurchaseOrder(MyTypes.PurchaseOrder po);
}
<ServiceContract()> _
Public Interface ISampleInterface
' No data contract is required since both the parameter and return
' types are both primitive types.
<OperationContract()> _
Function SquareRoot(ByVal root As Integer) As Double
' No Data Contract required because both parameter and return
' types are marked with the SerializableAttribute attribute.
<OperationContract()> _
Function GetPicture(ByVal pictureUri As System.Uri) As System.Drawing.Bitmap
' The MyTypes.PurchaseOrder is a complex type, and thus
' requires a data contract.
<OperationContract()> _
Function ApprovePurchaseOrder(ByVal po As MyTypes.PurchaseOrder) As Boolean
End Interface
Contoh berikut menunjukkan bagaimana kontrak data untuk MyTypes.PurchaseOrder jenis dibuat dengan menerapkan DataContractAttribute atribut dan DataMemberAttribute ke kelas dan anggotanya.
namespace MyTypes
{
[DataContract]
public class PurchaseOrder
{
private int poId_value;
// Apply the DataMemberAttribute to the property.
[DataMember]
public int PurchaseOrderId
{
get { return poId_value; }
set { poId_value = value; }
}
}
}
Namespace MyTypes
<System.Runtime.Serialization.DataContractAttribute()> _
Public Class PurchaseOrder
Private poId_value As Integer
' Apply the DataMemberAttribute to the property.
<DataMember()> _
Public Property PurchaseOrderId() As Integer
Get
Return poId_value
End Get
Set
poId_value = value
End Set
End Property
End Class
End Namespace
Catatan
Catatan berikut ini menyediakan item yang perlu dipertimbangkan saat membuat kontrak data:
Atribut IgnoreDataMemberAttribute hanya dihormati saat digunakan dengan jenis yang tidak ditandai. Ini termasuk jenis yang tidak ditandai dengan salah satu atribut DataContractAttribute, SerializableAttribute, CollectionDataContractAttribute, atau EnumMemberAttribute, atau ditandai sebagai serializable melalui cara lain (seperti IXmlSerializable).
Anda dapat menerapkan atribut DataMemberAttribute ke bidang dan properti.
Tingkat aksesibilitas anggota (internal, privat, dilindungi, atau publik) tidak memengaruhi kontrak data dengan cara apa pun.
Atribut DataMemberAttribute diabaikan jika diterapkan ke anggota statis.
Selama serialisasi, kode property-get dipanggil untuk anggota data properti untuk mendapatkan nilai properti yang akan diserialisasikan.
Selama deserialisasi, objek yang tidak diinisialisasi pertama kali dibuat, tanpa memanggil konstruktor apa pun pada jenis tersebut. Selanjutnya, semua anggota data dideserialisasi.
Selama deserialisasi, kode kumpulan properti dipanggil untuk anggota data properti untuk mengatur properti ke nilai yang sedang dideserialisasi.
Agar kontrak data valid, dimungkinkan untuk membuat serial semua anggota datanya. Untuk daftar lengkap jenis yang dapat diserialisasikan, lihat Jenis yang Didukung oleh Serializer Kontrak Data.
Jenis generik ditangani dengan cara yang sama persis seperti jenis non-generik. Tidak ada persyaratan khusus untuk parameter generik. Misalnya, pertimbangkan jenis berikut.
[DataContract]
public class MyGenericType1<T>
{
// Code not shown.
}
<DataContract()> _
Public Class MyGenericType1(Of T)
' Code not shown.
End Class
Jenis ini dapat diserialisasikan apakah jenis yang digunakan untuk parameter jenis generik (T) dapat diserialisasikan atau tidak. Karena harus dimungkinkan untuk menserialisasikan semua anggota data, jenis berikut hanya dapat diserialisasikan jika parameter jenis generik juga dapat diserialisasikan, seperti yang ditunjukkan dalam kode berikut.
[DataContract]
public class MyGenericType2<T>
{
[DataMember]
T theData;
}
<DataContract()> _
Public Class MyGenericType2(Of T)
<DataMember()> _
Dim theData As T
End Class
Untuk sampel kode lengkap layanan WCF yang menentukan kontrak data, lihat sampel Kontrak Data Dasar .
Lihat juga
- DataMemberAttribute
- DataContractAttribute
- Jenis yang Dapat Diserialisasikan
- Nama Kontrak Data
- Ekuivalensi Kontrak Data
- Urutan Anggota Data
- Jenis Kontrak Data yang Diketahui
- Kontrak DataForward-Compatible
- Penerapan Versi Kontrak Data
- Panggilan Balik SerialisasiVersion-Tolerant
- Nilai Default Anggota Data
- Jenis yang Didukung oleh Serializer Kontrak Data
- Cara: Membuat Kontrak Data Dasar untuk Kelas atau Struktur