Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Atributy lze použít k řízení serializace XML 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 třídou nebo názvem člena. 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 polí
XmlArrayAttribute a Atributy XmlArrayItemAttribute ří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é zadat typy, které lze zahrnout do pole.
Určí XmlArrayAttribute vlastnosti ohraničujícího elementu XML, který je výsledkem při serializaci pole. Například při serializaci pole níže ve výchozím nastavení vznikne XML prvek pojmenovaný Employees. Prvek Employees bude obsahovat řadu prvků pojmenovaných po typu Employeepole .
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>
Naopak XmlArrayItemAttribute řídí, jak jsou položky obsažené v poli serializovány.
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ých tříd
Dalším použitím XmlArrayItemAttribute je umožnit serializaci odvozených tříd. Do předchozího příkladu lze například přidat další třídu Manager, která je odvozena z Employee. Pokud kód nepoužijete XmlArrayItemAttribute, kód za běhu selže, 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 sekvence prvků
Pole můžete také serializovat jako plochou sekvenci elementů XML použitím XmlElementAttribute na pole, které vrací toto 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>
Dalším způsobem, jak tyto dva streamy XML odlišit, je použití nástroje definice schématu XML k vygenerování souborů dokumentu schématu XML (XSD) z kompilovaného kódu. 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í XmlElementAttribute na pole výsledná schema popisuje prvek následujícím způsobem:
<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />
Serializace ArrayListu
Třída ArrayList může obsahovat kolekci různorodých objektů. Proto můžete použít ArrayList podobně, jako používáte pole. Místo vytvoření atributu, který vrací pole typových objektů, můžete vytvořit atribut, který vrátí jeden ArrayList. Stejně jako u polí však musíte informovat XmlSerializer o typech objektů, které ArrayList obsahuje. Chcete-li toho dosáhnout, přiřaďte k poli více instancí XmlElementAttribute , 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é. Lze XmlRootAttribute použít pouze na jednu třídu: třída, která při serializaci představuje otevření a uzavření dokumentu XML – jinými slovy kořenový prvek. Naopak, XmlTypeAttribute lze použít na libovolnou třídu, včetně kořenové třídy.
Například v předchozích příkladech Group je třída kořenovou třídou a všechna její veřejná pole a vlastnosti se stanou elementy XML nalezené v dokumentu XML. Proto můžete mít pouze jednu kořenovou třídu. Použitím XmlRootAttribute můžete řídit XML stream generovaný XmlSerializer. Můžete například změnit název elementu a obor názvů.
Tento XmlTypeAttribute umožňuje řídit schéma vygenerovaného XML. Tato funkce je užitečná, když potřebujete publikovat schéma prostřednictvím webové služby XML. Následující příklad aplikuje obojí, XmlTypeAttribute a XmlRootAttribute, na 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>
Zabránění serializaci pomocí XmlIgnoreAttribute
Můžete narazit na situaci, kdy veřejná vlastnost nebo pole nemusí být serializována. Například pole nebo vlastnost lze použít k zahrnutí metadat. V takových případech použijte XmlIgnoreAttribute na pole nebo vlastnost a XmlSerializer přeskočí tuto část.