Share via


Kontrollera XML-serialisering med hjälp av attribut

Attribut kan användas för att styra XML-serialiseringen av ett objekt eller för att skapa en alternativ XML-ström från samma uppsättning klasser. Mer information om hur du skapar en alternativ XML-ström finns i Så här anger du ett alternativt elementnamn för en XML-ström.

Kommentar

Om XML-koden som genereras måste överensstämma med avsnitt 5 i W3C-dokumentet (World Wide Web Consortium) med titeln SOAP (Simple Object Access Protocol) 1.1 använder du attributen som anges i Attribut som styr kodad SOAP-serialisering.

Som standard bestäms ett XML-elementnamn av klass- eller medlemsnamnet. I en klass med namnet Bookskapar ett fält med namnet ISBN en XML-elementtagg <ISBN>, enligt följande exempel:

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

Standardbeteendet kan ändras om du vill ge elementet ett nytt namn. Följande kod visar hur ett attribut aktiverar den här funktionen genom att ElementName ange egenskapen för en XmlElementAttribute:

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

Mer information om attribut finns i Attribut. En lista över attribut som styr XML-serialisering finns i Attribut som styr XML-serialisering.

Kontrollera matrisens serialisering

Attributen XmlArrayAttributeXmlArrayItemAttribute och styr serialiseringen av matriser. Med hjälp av dessa attribut kan du styra datatypen elementnamn, namnområde och XML-schema (XSD) enligt definitionen i W3C-dokumentet med titeln XML-schema del 2: Datatyper. Du kan också ange vilka typer som kan ingå i en matris.

Avgör XmlArrayAttribute egenskaperna för det omslutande XML-element som resulterar när en matris serialiseras. Som standard resulterar serialiseringen av matrisen nedan till exempel i ett XML-element med namnet Employees. Elementet Employees innehåller en serie element med namnet efter matristypen 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;
}

En serialiserad instans kan likna följande kod:

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

Genom att tillämpa en XmlArrayAttributekan du ändra namnet på XML-elementet enligt följande:

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

Den resulterande XML-koden kan likna följande kod:

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

å XmlArrayItemAttributeandra sidan styr hur objekten i matrisen serialiseras.

Kommentar

Attributet tillämpas på fältet som returnerar matrisen.

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

Den resulterande XML-koden kan likna följande kod:

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

Serialisera härledda klasser

En annan användning av XmlArrayItemAttribute är att tillåta serialisering av härledda klasser. Till exempel kan en annan klass med namnet Manager som härleds från Employee läggas till i föregående exempel. Om du inte tillämpar XmlArrayItemAttributekommer koden att misslyckas vid körning eftersom den härledda klasstypen inte identifieras. Du kan åtgärda det här resultatet genom att tillämpa attributet två gånger, varje gång du anger Type egenskapen för varje acceptabel typ (bas och härledd).

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

En serialiserad instans kan likna följande kod:

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

Serialisera en matris som en sekvens med element

Du kan också serialisera en matris som en platt sekvens av XML-element genom att tillämpa en XmlElementAttribute på fältet som returnerar matrisen på följande sätt:

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

En serialiserad instans kan likna följande kod:

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

Ett annat sätt att särskilja de två XML-strömmarna är att använda XML-schemadefinitionsverktyget för att generera XML-schemadokumentfilerna (XSD) från den kompilerade koden. Mer information om hur du använder verktyget finns i XML-schemadefinitionsverktyget och XML-serialisering. När inget attribut tillämpas på fältet beskriver schemat elementet på följande sätt:

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

XmlElementAttribute När det tillämpas på fältet beskriver det resulterande schemat elementet på följande sätt:

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

Serialisera en matrislista

Klassen ArrayList kan innehålla en samling olika objekt. Du kan därför använda ungefär ArrayList som du använder en matris. I stället för att skapa ett fält som returnerar en matris med inskrivna objekt kan du dock skapa ett fält som returnerar ett enda ArrayList. Men precis som med matriser måste du informera XmlSerializer om vilka typer av objekt som ArrayList innehåller. Det gör du genom att tilldela flera instanser av XmlElementAttribute fältet, som du ser i följande exempel.

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

Kontrollera serialisering av klasser med XmlRootAttribute och XmlTypeAttribute

Du kan endast använda två attribut för en klass: XmlRootAttribute och XmlTypeAttribute. De här attributen är liknande. XmlRootAttribute Kan endast tillämpas på en klass: klassen som, när den serialiseras, representerar XML-dokumentets inledande och avslutande element , med andra ord rotelementet. , XmlTypeAttributeå andra sidan, kan tillämpas på vilken klass som helst, inklusive rotklassen.

I de föregående exemplen Group är klassen till exempel rotklassen, och alla dess offentliga fält och egenskaper blir XML-elementen som finns i XML-dokumentet. Därför kan du bara ha en rotklass. Genom att XmlRootAttributeanvända kan du styra XML-dataströmmen som genereras av XmlSerializer. Du kan till exempel ändra elementnamnet och namnområdet.

Med XmlTypeAttribute kan du styra schemat för den genererade XML-koden. Den här funktionen är användbar när du behöver publicera schemat via en XML-webbtjänst. Följande exempel gäller både XmlTypeAttribute och XmlRootAttribute för samma klass:

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

Om den här klassen kompileras och XML-schemadefinitionsverktyget används för att generera schemat, skulle du hitta följande XML som beskriver Group:

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

Om du däremot skulle serialisera en instans av klassen finns det bara NewGroupName i XML-dokumentet:

<NewGroupName>
    . . .
</NewGroupName>

Förhindra serialisering med XmlIgnoreAttribute

Du kan stöta på en situation där en offentlig egenskap eller ett fält inte behöver serialiseras. Ett fält eller en egenskap kan till exempel användas för att innehålla metadata. I sådana fall tillämpar du på XmlIgnoreAttribute fältet eller egenskapen och XmlSerializer hoppar över den.

Se även