Bagikan melalui


Nilai Default Anggota Data

Dalam .NET Framework, jenis memiliki konsep nilai default. Misalnya, untuk jenis referensi apa pun, nilai defaultnya adalah null, dan untuk jenis bilangan bulat adalah nol. Terkadang diinginkan untuk menghilangkan anggota data dari data berseri ketika diatur ke nilai defaultnya. Karena anggota memiliki nilai default, nilai aktual tidak perlu diserialisasikan; ini memiliki keunggulan performa.

Untuk menghilangkan anggota dari data berseri, atur propertiEmitDefaultValue dari atribut DataMemberAttribute ke false (defaultnya adalah true).

Catatan

Anda harus mengatur properti EmitDefaultValue ke false jika ada kebutuhan khusus untuk melakukannya, seperti untuk interoperabilitas atau pengurangan ukuran data.

Contoh

Kode berikut memiliki beberapa anggota dengan EmitDefaultValue diatur ke false.

[DataContract]
public class Employee
{
    [DataMember]
    public string employeeName = null;
    [DataMember]
    public int employeeID = 0;
    [DataMember(EmitDefaultValue = false)]
    public string position = null;
    [DataMember(EmitDefaultValue = false)]
    public int salary = 0;
    [DataMember(EmitDefaultValue = false)]
    public int? bonus = null;
    [DataMember(EmitDefaultValue = false)]
    public int targetSalary = 57800;
}
<DataContract()> _
Public Class Employee
    <DataMember()> _
    Public employeeName As String = Nothing
    <DataMember()> _
    Public employeeID As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public position As String = Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public salary As Integer = 0
    <DataMember(EmitDefaultValue:=False)> _
    Public Bonus As Integer = Bonus OrElse Nothing
    <DataMember(EmitDefaultValue:=False)> _
    Public targetSalary As Integer = 57800
End Class

Jika instans kelas ini diserialisasikan, hasilnya adalah sebagai berikut: employeeName dan employeeID diserialisasikan. Nilai null untuk employeeName dan nilai nol untuk employeeID secara eksplisit merupakan bagian dari data yang diserialisasikan. Namun, anggota position, salary, dan bonus tidak diserialisasikan. Akhirnya, targetSalary diserialisasikan seperti biasa, meskipun properti EmitDefaultValue diatur ke false, karena 57800 tidak cocok dengan nilai default .NET untuk bilangan bulat, yaitu nol.

Representasi XML

Jika contoh sebelumnya diserialisasikan ke XML, representasinya mirip dengan yang berikut ini.

<Employee>  
   <employeeName xsi:nil="true" />  
   <employeeID>0</employeeID>  
<targetSalary>57800</targetSalary>  
</Employee>  

Atribut xsi:nil ini adalah atribut khusus dalam namespace instans Skema XML World Wide Web Consortium (W3C) yang menyediakan cara yang dapat dioperasikan untuk secara eksplisit mewakili nilai null. Perhatikan bahwa tidak ada informasi sama sekali di XML tentang posisi, gaji, dan anggota data bonus. Ujung penerima dapat menafsirkannya masing-masing sebagai null, nol, dan null. Tidak ada jaminan bahwa deserializer pihak ketiga dapat membuat interpretasi yang benar, itulah sebabnya pola ini tidak direkomendasikan. Kelas DataContractSerializer selalu memilih interpretasi yang benar untuk nilai yang hilang.

Interaksi dengan IsRequired

Seperti yang dibahas dalam Penerapan Versi Kontrak Data, atribut DataMemberAttribute memiliki properti IsRequired (defaultnya adalah false). Properti menunjukkan apakah anggota data tertentu harus ada dalam data berseri saat sedang dideserialisasi. Jika IsRequired diatur ke true, (yang menunjukkan bahwa nilai harus ada) dan EmitDefaultValue diatur ke false (menunjukkan bahwa nilai tidak boleh ada jika diatur ke nilai defaultnya), nilai default untuk anggota data ini tidak dapat diserialisasikan karena hasilnya akan bertentangan. Jika anggota data tersebut diatur ke nilai defaultnya (biasanya null atau nol) dan serialisasi dicoba, SerializationException akan ditampilkan.

Representasi Skema

Detail representasi skema bahasa definisi Skema XML (XSD) dari anggota data saat properti EmitDefaultValue diatur ke false dibahas dalam Referensi Skema Kontrak Data. Namun, berikut ini adalah gambaran umum singkat:

  • Ketika EmitDefaultValue diatur ke false, itu diwakili dalam skema sebagai anotasi khusus untuk Windows Communication Foundation (WCF). Tidak ada cara yang dapat dioperasikan untuk mewakili informasi ini. Secara khusus, atribut "default" dalam skema tidak digunakan untuk tujuan ini, atribut minOccurs hanya dipengaruhi oleh pengaturan IsRequired, dan atribut nillable hanya dipengaruhi oleh jenis anggota data.

  • Nilai default aktual yang digunakan tidak ada dalam skema. Terserah titik akhir penerima untuk menafsirkan elemen yang hilang dengan tepat.

Pada impor skema, properti EmitDefaultValue secara otomatis diatur ke false setiap kali anotasi khusus WCF yang disebutkan sebelumnya dideteksi. Ini juga diatur ke false untuk jenis referensi yang memiliki properti nillable yang diatur ke false untuk mendukung skenario interoperabilitas tertentu yang umumnya terjadi saat mengonsumsi ASP.NET layanan Web.

Lihat juga