Řízení serializace XML pomocí atributů

Atributy lze použít k řízení XML serializace objektu nebo k vytvoření alternativní datový proud XML ze stejné sady tříd. Další informace o vytvoření alternativního datového proudu XML naleznete v tématu Postupy: Zadání alternativního názvu elementu pro datový proud XML.

Poznámka:

Pokud vygenerovaný kód XML musí odpovídat oddílu 5 dokumentu W3C (World Wide Web Consortium) s názvem Simple Object Access Protocol (SOAP) 1.1, použijte atributy uvedené v atributech, které řídí kódované serializace SOAP.

Ve výchozím nastavení je název elementu XML určen název třída nebo člen. Ve třídě s názvem Bookvytvoří pole s názvem ISBN značku <ISBN>elementu XML, jak je znázorněno v následujícím příkladu:

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

Výchozí chování lze změnit, pokud chcete elementu dát nový název. Následující kód ukazuje, jak atribut umožňuje tuto funkci nastavením ElementName vlastnosti XmlElementAttribute:

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

Další informace o atributech naleznete v tématu Atributy. Seznam atributů, které řídí serializaci XML naleznete v části Atributy, které řídí xml serializace.

Řízení serializace pole

XmlArrayItemAttribute Atributy XmlArrayAttribute řídí serializaci polí. Pomocí těchto atributů můžete řídit název elementu, obor názvů a datový typ schématu XML (XSD), jak je definován v dokumentu W3C s názvem XML Schema Part 2: Datatypes. Můžete také určit typy, které mohou být zahrnuty do pole.

XmlArrayAttribute Určí vlastnosti nadřazeného elementu XML, když je serializována pole. Například ve výchozím nastavení, serializací pole níže bude mít za následek element XML s názvem Employees. Employees Element bude obsahovat několik elementů s názvem po typ pole 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;
}

Serializovaná instance se může podobat následujícímu kódu:

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

Použitím parametru XmlArrayAttributemůžete změnit název elementu XML následujícím způsobem:

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

Výsledný kód XML může vypadat přibližně takto:

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

XmlArrayItemAttribute, Na druhé straně řídí, jak lze serializovat položky obsažené v poli.

Poznámka:

Atribut se použije u pole vracejícího pole.

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

Výsledný kód XML může vypadat přibližně takto:

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

Serializace odvozené třídy

Další používání XmlArrayItemAttribute je umožnit serializace odvozené třídy. Můžete například další třídu s názvem Manager která je odvozena od Employee mohou být přidány do předchozího příkladu. Pokud kód nepoužijete XmlArrayItemAttribute, kód se nezdaří za běhu, protože odvozený typ třídy se nerozpozná. Chcete-li tento výsledek napravit, použijte atribut dvakrát, pokaždé, když nastavíte Type vlastnost pro každý přijatelný typ (základ a odvozený).

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

Serializovaná instance se může podobat následujícímu kódu:

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

Serializace pole jako posloupnost elementy

Pole můžete také serializovat jako plochou sekvenci elementů XML použitím XmlElementAttribute pole, které vrací pole následujícím způsobem:

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

Serializovaná instance se může podobat následujícímu kódu:

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

Jiný způsob k rozlišení dvou datové proudy XML je použít nástroj definici schématu XML ke generování soubory dokumentů schématu XML (XSD) z zkompilovaný kód. Další informace o použití nástroje naleznete v tématu Nástroj definice schématu XML a serializace XML. Pokud u pole není použit žádný atribut, schéma popisuje prvek následujícím způsobem:

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

Při použití na XmlElementAttribute pole výsledné schéma popisuje prvek následujícím způsobem:

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

Serializace ArrayList

ArrayList Třídy mohou obsahovat kolekce rozmanitý objektů. Proto můžete použít ArrayList mnohem více, než použijete pole. Místo vytváření pole, které vrátí pole objektů typem, však můžete vytvořit pole, které vrátí jednu ArrayList. Však stejně jako u pole, musí informovat XmlSerializer typů objektů ArrayList obsahuje. K provedení této operace, přiřazení více instancí XmlElementAttribute na pole, jak je znázorněno v následujícím příkladu.

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

Řízení serializace tříd pomocí XmlRootAttribute a XmlTypeAttribute

Můžete použít dva atributy pouze pro třídu: XmlRootAttribute a XmlTypeAttribute. Tyto atributy jsou podobné. XmlRootAttribute Lze použít pouze jednu třídu: třída, že při serializován, představuje dokumentu XML je otevření a zavření element – jinými slovy, kořenový element. XmlTypeAttribute, Na druhé straně, lze použít na všechny třídy, včetně kořenová třída.

Například ve výše uvedených příkladech Group třída je kořenová třída a všechny veřejné polí a vlastností stát elementů XML nalezen v dokumentu XML. Proto můžete mít pouze jednu kořenovou třídu. Použitím XmlRootAttribute, můžete řídit datový proud XML generovaných XmlSerializer. Můžete například změnit název elementu a obor názvů.

XmlTypeAttribute Umožňuje řídit schéma vygenerovaný kód XML. Tato možnost je užitečná, pokud je třeba publikovat schématu pomocí webové služby XML. Následující příklad platí pro stejnou třídu i XmlTypeAttribute pro XmlRootAttribute stejnou třídu:

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

Pokud je tato třída zkompilována a nástroj definice schématu XML se používá k vygenerování jeho schématu, najdete následující xml popisující Group:

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

Pokud byste naopak serializovali instanci třídy, bylo by nalezeno pouze NewGroupName v dokumentu XML:

<NewGroupName>
    . . .
</NewGroupName>

Prevence serializace s XmlIgnoreAttribute

Můžete narazit na situaci, kdy veřejná vlastnost nebo pole nemusí být serializována. Můžete například pole nebo vlastnost může obsahovat metadat. V takových případech, použije XmlIgnoreAttribute na pole nebo vlastnost a XmlSerializer vynechá nad ním.

Viz také