Mengontrol serialisasi XML menggunakan atribut

Atribut dapat digunakan untuk mengontrol serialisasi XML suatu objek atau untuk membuat aliran XML alternatif dari kumpulan kelas yang sama. Untuk informasi selengkapnya tentang membuat aliran XML alternatif, lihat Cara: Menentukan Nama Elemen Alternatif untuk Aliran XML.

Catatan

Jika XML yang dihasilkan harus sesuai dengan bagian 5 dari dokumen World Wide Web Consortium (W3C) berjudul Simple Object Access Protocol (SOAP) 1.1, gunakan atribut yang tercantum dalam Atribut yang Mengontrol Serialisasi SOAP yang Dikodekan.

Secara default, nama elemen XML ditentukan oleh nama kelas atau anggota. Di kelas bernama Book, bidang bernama ISBN akan menghasilkan tag <ISBN>elemen XML , seperti yang ditunjukkan dalam contoh berikut:

Public Class Book
    Public ISBN As String
End Class
' When an instance of the Book class is serialized, it might
' produce this XML:
' <ISBN>1234567890</ISBN>.
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.

Perilaku default dapat diubah jika Anda ingin memberi elemen nama baru. Kode berikut menunjukkan bagaimana atribut mengaktifkan fungsionalitas ini dengan mengatur ElementName properti XmlElementAttributedari :

Public Class TaxRates
   < XmlElement(ElementName = "TaxRate")> _
    Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

Untuk informasi selengkapnya tentang atribut, lihat Atribut. Untuk daftar atribut yang mengontrol serialisasi XML, lihat Atribut yang Mengontrol Serialisasi XML.

Mengontrol Serialisasi Array

Atribut XmlArrayAttribute dan XmlArrayItemAttribute mengontrol serialisasi array. Dengan menggunakan atribut ini, Anda dapat mengontrol nama elemen, namespace, dan jenis data Skema XML (XSD) seperti yang didefinisikan dalam dokumen W3C berjudul XML Schema Part 2: Datatypes. Anda juga dapat menentukan jenis yang dapat disertakan dalam array.

XmlArrayAttribute akan menentukan properti elemen XML penutup yang menghasilkan saat array diserialisasikan. Misalnya, secara default, serialisasi array di bawah ini akan menghasilkan elemen XML bernama Employees. Elemen Employees akan berisi serangkaian elemen yang dinamai sesuai dengan jenis Employeearray.

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
public class Group {
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}

Instans berseri mungkin menyerupai kode berikut:

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</Employees>
</Group>

Dengan menerapkan XmlArrayAttribute, Anda dapat mengubah nama elemen XML, sebagai berikut:

Public Class Group
    <XmlArray("TeamMembers")> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

XML yang dihasilkan mungkin menyerupai kode berikut:

<Group>
<TeamMembers>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</TeamMembers>
</Group>

XmlArrayItemAttributeDi sisi lain, mengontrol bagaimana item yang terkandung dalam array diserialisasikan.

Catatan

Atribut diterapkan ke bidang yang mengembalikan array.

Public Class Group
    <XmlArrayItem("MemberName")> _
    Public Employee() As Employees
End Class
public class Group {
    [XmlArrayItem("MemberName")]
    public Employee[] Employees;
}

XML yang dihasilkan mungkin menyerupai kode berikut:

<Group>
<Employees>
    <MemberName>Haley</MemberName>
</Employees>
</Group>

Menserialisasikan Kelas Turunan

Penggunaan lain dari XmlArrayItemAttribute adalah untuk memungkinkan serialisasi kelas turunan. Misalnya, kelas lain bernama Manager yang berasal dari Employee dapat ditambahkan ke contoh sebelumnya. Jika Anda tidak menerapkan XmlArrayItemAttribute, kode akan gagal pada waktu proses karena jenis kelas turunan tidak akan dikenali. Untuk memperbaiki hasil ini, terapkan atribut dua kali, setiap kali mengatur Type properti untuk setiap jenis yang dapat diterima (dasar dan turunan).

Public Class Group
    <XmlArrayItem(Type:=GetType(Employee)), _
    XmlArrayItem(Type:=GetType(Manager))> _
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
Public Class Manager
Inherits Employee
    Public Level As Integer
End Class
public class Group {
    [XmlArrayItem(Type = typeof(Employee)),
    XmlArrayItem(Type = typeof(Manager))]
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}
public class Manager:Employee {
    public int Level;
}

Instans berseri mungkin menyerupai kode berikut:

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
    <Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    </Employee>
</Employees>
</Group>

Serialisasi Array sebagai Urutan Elemen

Anda juga dapat membuat serial array sebagai urutan datar elemen XML dengan menerapkan ke bidang yang XmlElementAttribute mengembalikan array sebagai berikut:

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlElement]
    public Employee[] Employees;
}

Instans berseri mungkin menyerupai kode berikut:

<Group>
<Employees>
    <Name>Haley</Name>
</Employees>
<Employees>
    <Name>Noriko</Name>
</Employees>
<Employees>
    <Name>Marco</Name>
</Employees>
</Group>

Cara lain untuk membedakan dua aliran XML adalah dengan menggunakan alat Definisi Skema XML untuk menghasilkan file dokumen Skema XML (XSD) dari kode yang dikompilasi. Untuk informasi selengkapnya tentang menggunakan alat ini, lihat Alat Definisi Skema XML dan Serialisasi XML. Ketika tidak ada atribut yang diterapkan ke bidang , skema menjelaskan elemen dengan cara berikut:

<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />

XmlElementAttribute Ketika diterapkan ke bidang , skema yang dihasilkan menjelaskan elemen sebagai berikut:

<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />

Menserialisasikan ArrayList

Kelas ArrayList dapat berisi kumpulan objek yang beragam. Oleh karena itu, Anda dapat menggunakan ArrayList sebanyak yang Anda gunakan array. Namun, alih-alih membuat bidang yang mengembalikan array objek yang diketik, Anda dapat membuat bidang yang mengembalikan satu ArrayList. Namun, seperti halnya array, Anda harus menginformasikan XmlSerializer jenis objek yang ArrayList dikandungnya. Untuk mencapai hal ini, tetapkan beberapa instans XmlElementAttribute ke bidang, seperti yang ditunjukkan dalam contoh berikut.

Public Class Group
    <XmlElement(Type:=GetType(Employee)), _
    XmlElement(Type:=GetType(Manager))> _
    Public Info As ArrayList
End Class
public class Group {
    [XmlElement(Type = typeof(Employee)),
    XmlElement(Type = typeof(Manager))]
    public ArrayList Info;
}

Mengontrol Serialisasi Kelas Menggunakan XmlRootAttribute dan XmlTypeAttribute

Anda dapat menerapkan dua atribut hanya ke kelas: XmlRootAttribute dan XmlTypeAttribute. Atribut ini serupa. XmlRootAttribute hanya dapat diterapkan ke satu kelas: kelas yang, saat diserialisasikan, mewakili elemen pembuka dan penutup dokumen XML—dengan kata lain, elemen akar. XmlTypeAttribute di sisi lain, dapat diterapkan ke kelas apa pun, termasuk kelas akar.

Misalnya, dalam contoh sebelumnya, Group kelas adalah kelas akar, dan semua bidang dan properti publiknya menjadi elemen XML yang ditemukan dalam dokumen XML. Oleh karena itu, Anda hanya dapat memiliki satu kelas root. Dengan menerapkan XmlRootAttribute, Anda dapat mengontrol aliran XML yang dihasilkan oleh XmlSerializer. Misalnya, Anda dapat mengubah nama elemen dan namespace layanan.

XmlTypeAttribute memungkinkan Anda mengontrol skema XML yang dihasilkan. Kemampuan ini berguna ketika Anda perlu menerbitkan skema melalui layanan Web XML. Contoh berikut menerapkan dan XmlTypeAttribute ke XmlRootAttribute kelas yang sama:

<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
    Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
    public Employee[] Employees;
}

Jika kelas ini dikompilasi, dan alat Definisi Skema XML digunakan untuk menghasilkan skemanya, Anda akan menemukan XML berikut yang menjelaskan Group:

<xs:element name="NewGroupName" type="NewTypeName" />

Sebaliknya, jika Anda membuat serialisasi instans kelas, hanya NewGroupName akan ditemukan dalam dokumen XML:

<NewGroupName>
    . . .
</NewGroupName>

Mencegah Serialisasi dengan XmlIgnoreAttribute

Anda mungkin menemukan situasi di mana properti atau bidang publik tidak perlu diserialisasikan. Misalnya, bidang atau properti dapat digunakan untuk berisi metadata. Dalam kasus seperti itu, terapkan XmlIgnoreAttribute ke bidang atau properti dan XmlSerializer akan melewatinya.

Lihat juga