Aracılığıyla paylaş


Öznitelikleri kullanarak XML serileştirmesini denetleme

Öznitelikler, bir nesnenin XML serileştirmesini denetlemek veya aynı sınıf kümesinden alternatif bir XML akışı oluşturmak için kullanılabilir. Alternatif XML akışı oluşturma hakkında daha fazla bilgi için bkz . Nasıl yapılır: XML Akışı için Alternatif Öğe Adı Belirtme.

Uyarı

Oluşturulan XML'nin Basit Nesne Erişim Protokolü (SOAP) 1.1 başlıklı World Wide Web Consortium (W3C) belgesinin 5. bölümüne uyması gerekiyorsa, Kodlanmış SOAP Serileştirmesini Denetleyen Öznitelikler bölümünde listelenen öznitelikleri kullanın.

Varsayılan olarak, xml öğesi adı sınıf veya üye adı tarafından belirlenir. adlı Booksınıfta ISBN adlı bir alan, aşağıdaki örnekte gösterildiği gibi bir XML öğesi etiketi <ISBN>oluşturur:

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>.

Öğeye yeni bir ad vermek istiyorsanız varsayılan davranış değiştirilebilir. Aşağıdaki kod, bir XmlElementAttribute'in ElementName özelliğini ayarlayarak bir özniteliğin bu işlevselliği nasıl etkinleştirdiğini gösterir.

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

Öznitelikler hakkında daha fazla bilgi için bkz . Öznitelikler. XML serileştirmesini denetleen özniteliklerin listesi için bkz. XML Serileştirmesini Denetleen Öznitelikler.

Dizi Serileştirmesini Denetleme

XmlArrayAttribute ve XmlArrayItemAttribute öznitelikleri dizilerin serileştirmesini denetler. Bu öznitelikleri kullanarak, XML Şema Bölüm 2: Veri Türleri başlıklı W3C belgesinde tanımlandığı gibi öğe adını, ad alanını ve XML Şeması (XSD) veri türünü denetleyebilirsiniz. Bir diziye dahil edilebilecek türleri de belirtebilirsiniz.

Bu XmlArrayAttribute, bir dizi serileştirildiğinde oluşturulacak XML öğesinin kapsadığı özellikleri belirler. Örneğin, varsayılan olarak, aşağıdaki dizi seri hale getirilerek adlı Employeesbir XML öğesi elde edilecek. Employees öğesi, Employee dizi türüne göre adlandırılmış bir dizi öğe içerecektir.

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;
}

Serileştirilmiş bir örnek aşağıdaki koda benzeyebilir:

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

bir XmlArrayAttributeuygulayarak XML öğesinin adını aşağıdaki gibi değiştirebilirsiniz:

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

Sonuçta elde edilen XML aşağıdaki koda benzeyebilir:

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

XmlArrayItemAttributeÖte yandan , dizideki öğelerin nasıl seri hale getirilmeyi denetler.

Uyarı

özniteliği, diziyi döndüren alana uygulanır.

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

Sonuçta elde edilen XML aşağıdaki koda benzeyebilir:

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

Türetilmiş Sınıfları Serileştirme

başka bir kullanımı XmlArrayItemAttribute türetilmiş sınıfların serileştirilmesine izin vermektir. Örneğin, Employee öğesinden türetilen Manager adlı başka bir sınıf önceki örneğe eklenebilir. uygulamazsanız XmlArrayItemAttribute, türetilmiş sınıf türü tanınmayacağından kod çalışma zamanında başarısız olur. Bu sonucu düzeltmek için, her iki uygun tür (taban ve türetilmiş) için de Type özelliğini ayarlayarak özniteliğini iki kez uygulayın.

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;
}

Serileştirilmiş bir örnek aşağıdaki koda benzeyebilir:

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

Diziyi Öğe Dizisi Olarak Serileştirme

Ayrıca, XmlElementAttribute uygulayarak böyle bir diziyi düz bir XML öğeleri dizisi olarak, diziyi döndüren alanda seri hale getirebilirsiniz.

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

Serileştirilmiş bir örnek aşağıdaki koda benzeyebilir:

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

İki XML akışını ayırt etmenin bir diğer yolu da XML Şeması Tanımı aracını kullanarak derlenen koddan XML Şeması (XSD) belge dosyalarını oluşturmaktır. Aracı kullanma hakkında daha fazla bilgi için bkz. XML Şema Tanımı Aracı ve XML Serileştirme. Alana hiçbir öznitelik uygulanmadığında şema, öğesini aşağıdaki şekilde açıklar:

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

XmlElementAttribute alanına uygulandığında, sonuçta elde edilen şema aşağıdaki gibi öğesini açıklar:

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

ArrayList'i Seri Hale Getirme

sınıfı, ArrayList çeşitli nesnelerden oluşan bir koleksiyon içerebilir. Bu nedenle, bir dizi gibi ArrayList kullanabilirsiniz. Ancak türü belirtilmiş nesneler dizisini döndüren bir alan oluşturmak yerine, tek bir ArrayList döndüren bir alan oluşturabilirsiniz. Ancak, dizilerde olduğu gibi, XmlSerializer'a, ArrayList'in içerdiği nesnelerin türlerini bildirmeniz gerekir. Bunu yapmak için, aşağıdaki örnekte gösterildiği gibi XmlElementAttribute öğesinin birden çok örneğini alana atayın.

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;
}

XmlRootAttribute ve XmlTypeAttribute Kullanarak Sınıfların Serileştirilmesini Denetleme

Yalnızca bir sınıfa iki öznitelik uygulayabilirsiniz: XmlRootAttribute ve XmlTypeAttribute. Bu öznitelikler benzerdir. XmlRootAttribute yalnızca bir sınıfa uygulanabilir: seri hale getirildiğinde XML belgesinin açma ve kapatma öğesini (başka bir deyişle kök öğeyi) temsil eden sınıf. XmlTypeAttributeÖte yandan , kök sınıfı da dahil olmak üzere herhangi bir sınıfa uygulanabilir.

Örneğin, önceki örneklerde Group , sınıf kök sınıfıdır ve tüm genel alanları ve özellikleri XML belgesinde bulunan XML öğeleri haline gelir. Bu nedenle, yalnızca bir kök sınıfınız olabilir. XmlSerializer tarafından oluşturulan XML akışını XmlRootAttribute ile uygulayarak denetleyebilirsiniz. Örneğin, öğe adını ve ad alanını değiştirebilirsiniz.

, XmlTypeAttribute oluşturulan XML'in şemasını denetlemenize olanak tanır. Bu özellik, şemayı bir XML Web hizmeti aracılığıyla yayımlamanız gerektiğinde kullanışlıdır. Aşağıdaki örnek hem XmlTypeAttribute hem de XmlRootAttribute aynı sınıfa uygulanır.

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

Bu sınıf derlenmişse ve şemasını oluşturmak için XML Şema Tanımı aracı kullanılıyorsa, aşağıdaki XML'yi açıklarken Groupbulursunuz:

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

Buna karşılık, sınıfın bir örneğini seri hale getirmek istiyorsanız, yalnızca NewGroupName XML belgesinde bulunabilir:

<NewGroupName>
    . . .
</NewGroupName>

XmlIgnoreAttribute ile Serileştirmeyi Önleme

Genel bir özelliğin veya alanın serileştirilmesine gerek olmayan bir durumla karşılaşabilirsiniz. Örneğin, meta verileri içeren bir alan veya özellik kullanılabilir. Bu gibi durumlarda, XmlIgnoreAttribute alan veya özelliğe uygulanır ve XmlSerializer üzerinden atlar.

Ayrıca bakınız