Ö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.
Not
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, bir XML öğesi adı, sınıf veya üye ada göre belirlenir. adlı Book
sı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 özniteliğin özelliğini XmlElementAttributeayarlayarak bu işlevselliği nasıl etkinleştirdiği ElementName 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 dizide dahil edilebilir türleri de belirtebilirsiniz.
XmlArrayAttribute Bir dizi serileştirilmiş olduğunda, kapsayan XML öğesi özelliklerini belirler. Örneğin, varsayılan olarak, aşağıdaki dizi serileştirmek adlı bir XML öğesi sonuçlanacak Employees
. Employees
Öğesi, bir dizi sonra dizi türü adlı öğeleri içerecek Employee
.
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.
Not
ö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üretilen sınıfların seri hale getirilmedi
Başka bir kullanımını XmlArrayItemAttribute türetilen sınıfların serileştirmek izin vermektir. Örneğin, adlı başka bir sınıf Manager
, türetilen Employee
önceki örneği 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 özniteliğini her kabul edilebilir tür (temel ve türetilmiş) için özelliğini her ayarlayıp Type 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>
Bir dizi öğeleri dizisi olarak seri hale getiriliyor.
Ayrıca, diziyi döndüren alana aşağıdaki gibi uygulayarak bir diziyi düz bir XmlElementAttribute XML öğeleri dizisi olarak 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 seri hale getirilmedi
ArrayList Sınıfı, farklı nesnelerinin bir koleksiyonu içerebilir. Bu nedenle, diziyi ArrayList kullandığınız kadar çok kullanabilirsiniz. Yazılan nesnelerin bir dizi döndürür bir alan oluşturmak yerine, ancak, tek bir döndüren bir alan oluşturabileceğiniz ArrayList. Ancak, dizilerle gibi sizi bilgilendirmek gerekir XmlSerializer nesneleri türlerinin ArrayList içerir. Bunu gerçekleştirmek için birden çok örneğinin atamak XmlElementAttribute alanına, aşağıdaki örnekte gösterildiği gibi.
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 İçin yalnızca bir sınıf uygulanabilir: sınıf serileştirilmiş olduğunda, temsil eder XML belgesi açma kapatma ve, öğe — diğer bir deyişle, kök öğe. XmlTypeAttribute, Diğer el, kök sınıfı dahil olmak üzere herhangi bir sınıf uygulanabilir.
Örneğin, önceki örneklerde, Group
kök sınıfı ve tüm genel alanlar ve Özellikler XML belgesinde bulunan XML öğelerine haline gelir. Bu nedenle, yalnızca bir kök sınıfınız olabilir. uygulayarak XmlRootAttribute, tarafından XmlSerializeroluşturulan XML akışını denetleyebilirsiniz. Örneğin, ad alanı ve öğe adını değiştirebilirsiniz.
, XmlTypeAttribute oluşturulan XML'in şemasını denetlemenize olanak tanır. Bu yetenek şeması XML Web hizmeti aracılığıyla yayımlamak gerektiğinde faydalıdır. Aşağıdaki örnek hem hem de XmlTypeAttribute aynı XmlRootAttribute 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 Group
bulursunuz:
<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
Ortak bir özelliğin veya alanın seri hale getirilmeye gerek olmadığı bir durumla karşılaşabilirsiniz. Örneğin, bir alan veya özellik meta veriler içeren için kullanılabilir. Böyle durumlarda, uygulama XmlIgnoreAttribute alanı veya özelliği için ve XmlSerializer üzerine atlar.