DataContractAttribute Classe
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Specifica che il tipo definisce o implementa un contratto dati ed è serializzabile da un serializzatore, ad esempio il DataContractSerializer. Per rendere serializzabile il tipo, gli autori di tipi devono definire un contratto dati per il tipo.
public ref class DataContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)]
public sealed class DataContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)>]
type DataContractAttribute = class
inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
- Ereditarietà
- Attributi
Esempio
Nell'esempio seguente serializza e deserializza una classe denominata Person a cui è stato applicato l'oggetto DataContractAttribute . Si noti che le Namespace proprietà e Name sono state impostate su valori che eseguono l'override delle impostazioni predefinite.
namespace DataContractAttributeExample
{
// Set the Name and Namespace properties to new values.
[DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
class Person : IExtensibleDataObject
{
// To implement the IExtensibleDataObject interface, you must also
// implement the ExtensionData property.
private ExtensionDataObject extensionDataObjectValue;
public ExtensionDataObject ExtensionData
{
get
{
return extensionDataObjectValue;
}
set
{
extensionDataObjectValue = value;
}
}
[DataMember(Name = "CustName")]
internal string Name;
[DataMember(Name = "CustID")]
internal int ID;
public Person(string newName, int newID)
{
Name = newName;
ID = newID;
}
}
class Test
{
public static void Main()
{
try
{
WriteObject("DataContractExample.xml");
ReadObject("DataContractExample.xml");
Console.WriteLine("Press Enter to end");
Console.ReadLine();
}
catch (SerializationException se)
{
Console.WriteLine
("The serialization operation failed. Reason: {0}",
se.Message);
Console.WriteLine(se.Data);
Console.ReadLine();
}
}
public static void WriteObject(string path)
{
// Create a new instance of the Person class and
// serialize it to an XML file.
Person p1 = new Person("Mary", 1);
// Create a new instance of a StreamWriter
// to read and write the data.
FileStream fs = new FileStream(path,
FileMode.Create);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
ser.WriteObject(writer, p1);
Console.WriteLine("Finished writing object.");
writer.Close();
fs.Close();
}
public static void ReadObject(string path)
{
// Deserialize an instance of the Person class
// from an XML file. First create an instance of the
// XmlDictionaryReader.
FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
// Create the DataContractSerializer instance.
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
// Deserialize the data and read it from the instance.
Person newPerson = (Person)ser.ReadObject(reader);
Console.WriteLine("Reading this object:");
Console.WriteLine(String.Format("{0}, ID: {1}",
newPerson.Name, newPerson.ID));
fs.Close();
}
}
}
Namespace DataContractAttributeExample
' Set the Name and Namespace properties to new values.
<DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")> _
Class Person
Implements IExtensibleDataObject
' To implement the IExtensibleDataObject interface, you must also
' implement the ExtensionData property.
Private extensionDataObjectValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return extensionDataObjectValue
End Get
Set
extensionDataObjectValue = value
End Set
End Property
<DataMember(Name := "CustName")> _
Friend Name As String
<DataMember(Name := "CustID")> _
Friend ID As Integer
Public Sub New(ByVal newName As String, ByVal newID As Integer)
Name = newName
ID = newID
End Sub
End Class
Class Test
Public Shared Sub Main()
Try
WriteObject("DataContractExample.xml")
ReadObject("DataContractExample.xml")
Console.WriteLine("Press Enter to end")
Console.ReadLine()
Catch se As SerializationException
Console.WriteLine("The serialization operation failed. Reason: {0}", _
se.Message)
Console.WriteLine(se.Data)
Console.ReadLine()
End Try
End Sub
Public Shared Sub WriteObject(ByVal path As String)
' Create a new instance of the Person class and
' serialize it to an XML file.
Dim p1 As New Person("Mary", 1)
' Create a new instance of a StreamWriter
' to read and write the data.
Dim fs As New FileStream(path, FileMode.Create)
Dim writer As XmlDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(fs)
Dim ser As New DataContractSerializer(GetType(Person))
ser.WriteObject(writer, p1)
Console.WriteLine("Finished writing object.")
writer.Close()
fs.Close()
End Sub
Public Shared Sub ReadObject(ByVal path As String)
' Deserialize an instance of the Person class
' from an XML file. First create an instance of the
' XmlDictionaryReader.
Dim fs As New FileStream(path, FileMode.OpenOrCreate)
Dim reader As XmlDictionaryReader = XmlDictionaryReader. _
CreateTextReader(fs, New XmlDictionaryReaderQuotas())
' Create the DataContractSerializer instance.
Dim ser As New DataContractSerializer(GetType(Person))
' Deserialize the data and read it from the instance.
Dim newPerson As Person = CType(ser.ReadObject(reader), Person)
Console.WriteLine("Reading this object:")
Console.WriteLine(String.Format("{0}, ID: {1}", newPerson.Name, newPerson.ID))
fs.Close()
End Sub
End Class
End Namespace
Commenti
Applicare l'attributo DataContractAttribute ai tipi (classi, strutture o enumerazioni) utilizzati nelle operazioni di serializzazione e deserializzazione da parte di DataContractSerializer. Se si inviano o si ricevono messaggi usando l'infrastruttura windows Communication Foundation (WCF), è necessario applicare anche a DataContractAttribute tutte le classi che contengono e modificano i dati inviati nei messaggi. Per altre informazioni sui contratti dati, vedere Uso di contratti dati.
È inoltre necessario applicare l'oggetto DataMemberAttribute a qualsiasi campo, proprietà o evento che contiene valori da serializzare. Applicando il DataContractAttribute, si abilita in modo esplicito il DataContractSerializer a serializzare e deserializzare i dati.
Caution
È possibile applicare DataMemberAttribute a campi privati. Tenere presente che i dati restituiti dal campo (anche se sono privati) vengono serializzati e deserializzati e pertanto possono essere visualizzati o intercettati da un utente malintenzionato o da un processo.
Per altre informazioni sui contratti dati, vedere gli argomenti elencati in Uso di contratti dati.
Contratti dati
Un contratto dati è una descrizione astratta di un set di campi con un nome e un tipo di dati per ogni campo. Il contratto dati esiste al di fuori di qualsiasi singola implementazione per consentire l'interoperabilità dei servizi su piattaforme diverse. Se i dati passati tra i servizi sono conformi allo stesso contratto, tutti i servizi possono elaborare i dati. Questa elaborazione è nota anche come sistema ad accoppiamento libero. Un contratto dati è anche simile a un'interfaccia in quanto il contratto specifica il modo in cui i dati devono essere recapitati in modo che possano essere elaborati da un'applicazione. Ad esempio, il contratto dati può richiedere un tipo di dati denominato "Person" con due campi di testo, denominato "FirstName" e "LastName". Per creare un contratto dati, applicare DataContractAttribute alla classe e DataMemberAttribute a tutti i campi o alle proprietà che devono essere serializzati. In caso di serializzazione, i dati sono conformi al contratto dati integrato in modo implicito nel tipo .
Note
Un contratto di dati differisce in modo significativo da un'interfaccia reale per comportamento di ereditarietà. Le interfacce vengono ereditate da qualsiasi tipo derivato. Quando si applica a DataContractAttribute una classe base, i tipi derivati non ereditano l'attributo o il comportamento. Tuttavia, se un tipo derivato ha un contratto dati, i membri dati della classe di base vengono serializzati. Tuttavia, è necessario applicare DataMemberAttribute ai nuovi membri in una classe derivata per renderli serializzabili.
Documenti di XML Schema e lo strumento SvcUtil
Se si scambiano dati con altri servizi, è necessario descrivere il contratto dati. Per la versione corrente di DataContractSerializer, è possibile usare un XML Schema per definire i contratti dati. Altri tipi di metadati/descrizione possono essere usati per lo stesso scopo. Per creare uno schema XML dall'applicazione, usare lo strumento utilità metadati ServiceModel (Svcutil.exe) con l'opzione della riga di comando /dconly . Quando l'input dello strumento è un assembly, per impostazione predefinita, lo strumento genera un set di XML Schema che definiscono tutti i tipi di contratto dati trovati in tale assembly. Al contrario, è anche possibile usare lo strumento Svcutil.exe per creare definizioni di classi Visual Basic o C# conformi ai requisiti di XML Schema che usano costrutti che possono essere espressi dai contratti dati. In questo caso, l'opzione della riga di comando /dconly non è obbligatoria.
Se l'input dello strumento Svcutil.exe è uno schema XML, per impostazione predefinita, lo strumento crea un set di classi. Se si esaminano le classi, si scopre che il DataContractAttribute è stato applicato. È possibile usare queste classi per creare una nuova applicazione per elaborare i dati che devono essere scambiati con altri servizi.
È anche possibile eseguire lo strumento su un endpoint che restituisce un documento WSDL (Web Services Description Language) per generare automaticamente il codice e la configurazione per creare un client Windows Communication Foundation (WCF). Il codice generato include tipi contrassegnati con .DataContractAttribute
Riutilizzare i tipi esistenti
Un contratto dati ha due requisiti di base: un nome stabile e un elenco di membri. Il nome stabile è costituito dall'URI (Uniform Resource Identifier) dello spazio dei nomi e dal nome locale del contratto. Per impostazione predefinita, quando si applica a DataContractAttribute una classe, usa il nome della classe come nome locale e lo spazio dei nomi della classe (preceduto da "http://schemas.datacontract.org/2004/07/") come URI dello spazio dei nomi. È possibile eseguire l'override delle impostazioni predefinite impostando le Name proprietà e Namespace . È anche possibile modificare lo spazio dei nomi applicando ContractNamespaceAttribute allo spazio dei nomi. Usare questa funzionalità quando si dispone di un tipo esistente che elabora i dati esattamente come richiesto, ma ha uno spazio dei nomi e un nome di classe diversi dal contratto dati. Eseguendo l'override dei valori predefiniti, è possibile riutilizzare il tipo esistente e avere i dati serializzati conformi al contratto dati.
Note
In qualsiasi codice è possibile usare la parola DataContract anziché quella più lunga DataContractAttribute.
Versionamento
Un contratto dati può anche contenere versioni successive di se stesso. Ovvero, quando una versione successiva del contratto include dati aggiuntivi, tali dati vengono archiviati e restituiti a un mittente non interessato. A tale scopo, implementare l'interfaccia IExtensibleDataObject .
Per altre informazioni sul controllo delle versioni, vedere Controllo delle versioni del contratto dati.
Costruttori
| Nome | Descrizione |
|---|---|
| DataContractAttribute() |
Inizializza una nuova istanza della classe DataContractAttribute. |
Proprietà
| Nome | Descrizione |
|---|---|
| IsNameSetExplicitly |
Ottiene un valore che indica se Name è stato impostato in modo esplicito. |
| IsNamespaceSetExplicitly |
Ottiene un valore che indica se Namespace è stato impostato in modo esplicito. |
| IsReference |
Ottiene o imposta un valore che indica se mantenere i dati del riferimento all'oggetto. |
| IsReferenceSetExplicitly |
Ottiene un valore che indica se IsReference è stato impostato in modo esplicito. |
| Name |
Ottiene o imposta il nome del contratto di dati per il tipo. |
| Namespace |
Ottiene o imposta lo spazio dei nomi del contratto di dati per il tipo. |
| TypeId |
Se implementato in una classe derivata, ottiene un identificatore univoco per questo Attribute. (Ereditato da Attribute) |
Metodi
| Nome | Descrizione |
|---|---|
| Equals(Object) |
Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato. (Ereditato da Attribute) |
| GetHashCode() |
Restituisce il codice hash per questa istanza. (Ereditato da Attribute) |
| GetType() |
Ottiene il Type dell'istanza corrente. (Ereditato da Object) |
| IsDefaultAttribute() |
Quando sottoposto a override in una classe derivata, indica se il valore di questa istanza è il valore predefinito per la classe derivata. (Ereditato da Attribute) |
| Match(Object) |
Quando sottoposto a override in una classe derivata, restituisce un valore che indica se questa istanza è uguale a un oggetto specificato. (Ereditato da Attribute) |
| MemberwiseClone() |
Crea una copia superficiale del Objectcorrente. (Ereditato da Object) |
| ToString() |
Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
Implementazioni dell'interfaccia esplicita
| Nome | Descrizione |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Esegue il mapping di un set di nomi a un set corrispondente di identificatori dispatch. (Ereditato da Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Recupera le informazioni sul tipo per un oggetto, che può essere utilizzato per ottenere le informazioni sul tipo per un'interfaccia. (Ereditato da Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Recupera il numero di interfacce di informazioni sul tipo fornite da un oggetto (0 o 1). (Ereditato da Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Fornisce l'accesso alle proprietà e ai metodi esposti da un oggetto . (Ereditato da Attribute) |