Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Gli attributi possono essere utilizzati per controllare la serializzazione XML di un oggetto o per creare un flusso XML alternativo dallo stesso set di classi. Per altre informazioni sulla creazione di un flusso XML alternativo, vedere Procedura: Specificare un nome di elemento alternativo per un flusso XML.
Annotazioni
Se il codice XML generato deve essere conforme alla sezione 5 del documento W3C (World Wide Web Consortium) denominato Simple Object Access Protocol (SOAP) 1.1, utilizzare gli attributi elencati in Attributi che controllano la serializzazione SOAP codificata.
Per impostazione predefinita, un nome di elemento XML è determinato dal nome della classe o del membro. In una classe denominata Book, un campo denominato ISBN produrrà un tag <ISBN>di elemento XML, come illustrato nell'esempio seguente:
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>.
Il comportamento predefinito può essere modificato se si desidera assegnare all'elemento un nuovo nome. Il codice seguente illustra come un attributo abilita questa funzionalità impostando la ElementName proprietà di un oggetto XmlElementAttribute:
Public Class TaxRates
< XmlElement(ElementName = "TaxRate")> _
Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
[XmlElement(ElementName = "TaxRate")]
public decimal ReturnTaxRate;
}
Per altre informazioni sugli attributi, vedere Attributi. Per un elenco di attributi che controllano la serializzazione XML, vedere Attributi che controllano la serializzazione XML.
Controllo della serializzazione di matrici
Gli attributi XmlArrayAttribute e XmlArrayItemAttribute controllano la serializzazione degli array. Usando questi attributi, è possibile controllare il nome dell'elemento, lo spazio dei nomi e il tipo di dati XML Schema (XSD), come definito nel documento W3C denominato XML Schema Part 2: Datatypes. È anche possibile specificare i tipi che possono essere inclusi in una matrice.
XmlArrayAttribute determinerà le proprietà dell'elemento XML di chiusura risultante quando una matrice viene serializzata. Per impostazione predefinita, ad esempio, la serializzazione della matrice seguente comporterà un elemento XML denominato Employees. L'elemento Employees conterrà una serie di elementi denominati dopo il tipo di Employeematrice .
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;
}
Un'istanza serializzata potrebbe essere simile al codice seguente:
<Group>
<Employees>
<Employee>
<Name>Haley</Name>
</Employee>
</Employees>
</Group>
Applicando un XmlArrayAttributeoggetto , è possibile modificare il nome dell'elemento XML, come indicato di seguito:
Public Class Group
<XmlArray("TeamMembers")> _
Public Employees() As Employee
End Class
public class Group {
[XmlArray("TeamMembers")]
public Employee[] Employees;
}
Il codice XML risultante potrebbe essere simile al codice seguente:
<Group>
<TeamMembers>
<Employee>
<Name>Haley</Name>
</Employee>
</TeamMembers>
</Group>
L'oggetto XmlArrayItemAttribute, d'altra parte, controlla la modalità di serializzazione degli elementi contenuti nella matrice.
Annotazioni
L'attributo viene applicato al campo che restituisce la matrice.
Public Class Group
<XmlArrayItem("MemberName")> _
Public Employee() As Employees
End Class
public class Group {
[XmlArrayItem("MemberName")]
public Employee[] Employees;
}
Il codice XML risultante potrebbe essere simile al codice seguente:
<Group>
<Employees>
<MemberName>Haley</MemberName>
</Employees>
</Group>
Serializzazione di classi derivate
Un altro uso del XmlArrayItemAttribute è quello di consentire la serializzazione delle classi derivate. Ad esempio, un'altra classe denominata Manager da Employee può essere aggiunta all'esempio precedente. Se non si applica XmlArrayItemAttribute, il codice avrà esito negativo in fase di esecuzione perché il tipo di classe derivata non verrà riconosciuto. Per risolvere questo risultato, applicare l'attributo due volte, ogni volta che si imposta la Type proprietà per ogni tipo accettabile (base e derivato).
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;
}
Un'istanza serializzata potrebbe essere simile al codice seguente:
<Group>
<Employees>
<Employee>
<Name>Haley</Name>
</Employee>
<Employee xsi:type = "Manager">
<Name>Ann</Name>
<Level>3</Level>
</Employee>
</Employees>
</Group>
Serializzazione di una matrice come sequenza di elementi
È anche possibile serializzare una matrice come sequenza flat di elementi XML applicando un XmlElementAttribute oggetto al campo che restituisce la matrice come indicato di seguito:
Public Class Group
<XmlElement> _
Public Employees() As Employee
End Class
public class Group {
[XmlElement]
public Employee[] Employees;
}
Un'istanza serializzata potrebbe essere simile al codice seguente:
<Group>
<Employees>
<Name>Haley</Name>
</Employees>
<Employees>
<Name>Noriko</Name>
</Employees>
<Employees>
<Name>Marco</Name>
</Employees>
</Group>
Un altro modo per distinguere i due flussi XML consiste nell'usare lo strumento XML Schema Definition per generare i file di documento XML Schema (XSD) dal codice compilato. Per altre informazioni sull'uso dello strumento, vedere Lo strumento di definizione dello schema XML e la serializzazione XML. Quando non viene applicato alcun attributo al campo, lo schema descrive l'elemento nel modo seguente:
<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />
Quando l'oggetto XmlElementAttribute viene applicato al campo, lo schema risultante descrive l'elemento come segue:
<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />
Serializzazione di un ArrayList
La ArrayList classe può contenere una raccolta di oggetti diversi. È quindi possibile usare un valore ArrayList molto simile a quello usato da una matrice. Anziché creare un campo che restituisce una matrice di oggetti tipizzati, è tuttavia possibile creare un campo che restituisce un singolo ArrayListoggetto . Tuttavia, come con le array, devi comunicare a XmlSerializer i tipi di oggetti che ArrayList contiene. A tale scopo, assegnare più istanze di XmlElementAttribute al campo , come illustrato nell'esempio seguente.
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;
}
Controllo della serializzazione delle classi tramite XmlRootAttribute e XmlTypeAttribute
È possibile applicare due attributi solo a una classe: XmlRootAttribute e XmlTypeAttribute. Questi attributi sono simili. Può XmlRootAttribute essere applicato a una sola classe: la classe che, quando serializzata, rappresenta l'elemento di apertura e chiusura del documento XML, ovvero l'elemento radice. L'oggetto XmlTypeAttribute, d'altra parte, può essere applicato a qualsiasi classe, inclusa la classe radice.
Negli esempi precedenti, ad esempio, la Group classe è la classe radice e tutti i relativi campi e proprietà pubblici diventano gli elementi XML trovati nel documento XML. Pertanto, è possibile avere una sola classe radice. Applicando , XmlRootAttributeè possibile controllare il flusso XML generato da XmlSerializer. Ad esempio, è possibile modificare il nome dell'elemento e lo spazio dei nomi.
XmlTypeAttribute consente di controllare lo schema del codice XML generato. Questa funzionalità è utile quando è necessario pubblicare lo schema tramite un servizio Web XML. L'esempio seguente applica sia XmlTypeAttribute che XmlRootAttribute alla stessa classe:
<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
public Employee[] Employees;
}
Se questa classe viene compilata e lo strumento XML Schema Definition viene usato per generare il relativo schema, è possibile trovare il codice XML seguente che Groupdescrive :
<xs:element name="NewGroupName" type="NewTypeName" />
Al contrario, se si dovesse serializzare un'istanza della classe, nel documento XML verrà trovato solo NewGroupName.
<NewGroupName>
. . .
</NewGroupName>
Prevenzione della serializzazione con XmlIgnoreAttribute
Potrebbe verificarsi una situazione in cui non è necessario serializzare una proprietà o un campo pubblico. Ad esempio, è possibile usare un campo o una proprietà per contenere metadati. In questi casi, applicare XmlIgnoreAttribute al campo o alla proprietà e XmlSerializer li ignorerà.
Vedere anche
- Attributi che controllano la serializzazione XML
- Attributi che controllano la serializzazione SOAP codificata
- Introduzione alla serializzazione XML
- Esempi di serializzazione XML
- Procedura: Specificare un nome di elemento alternativo per un flusso XML
- Procedura: Serializzare un oggetto
- Procedura: Deserializzare un oggetto