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, atributminOccurs
hanya dipengaruhi oleh pengaturan IsRequired, dan atributnillable
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.