DataContractAttribute Klas
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Hiermee geeft u op dat het type een gegevenscontract definieert of implementeert en serialiseerbaar is door een serialisatiefunctie, zoals de DataContractSerializer. Om hun type serialiseerbaar te maken, moeten typeauteurs een gegevenscontract definiëren voor hun type.
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
- Overname
- Kenmerken
Voorbeelden
In het volgende voorbeeld wordt een klasse geserialiseerd Person en gedeserialiseerd waarmee de DataContractAttribute klasse is toegepast. Houd er rekening mee dat de Namespace eigenschappen Name zijn ingesteld op waarden die de standaardinstellingen overschrijven.
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
Opmerkingen
Pas het DataContractAttribute kenmerk toe op typen (klassen, structuren of opsommingen) die worden gebruikt in serialisatie- en deserialisatiebewerkingen door de DataContractSerializer. Als u berichten verzendt of ontvangt met behulp van de WCF-infrastructuur (Windows Communication Foundation), moet u ook de DataContractAttribute klassen toepassen die gegevens bevatten en bewerken die in berichten worden verzonden. Zie Gegevenscontracten gebruiken voor meer informatie over gegevenscontracten.
U moet ook de DataMemberAttribute waarde toepassen op een veld, eigenschap of gebeurtenis die waarden bevat die u wilt serialiseren. Door de DataContractAttributetoe te passen, kunt u de DataContractSerializer gegevens expliciet serialiseren en deserialiseren.
Caution
U kunt de DataMemberAttribute velden toepassen op privévelden. Houd er rekening mee dat de gegevens die door het veld worden geretourneerd (zelfs als het privé is) worden geserialiseerd en gedeserialiseerd, en dus kunnen worden bekeken of onderschept door een kwaadwillende gebruiker of proces.
Zie de onderwerpen in Het gebruik van gegevenscontracten voor meer informatie over gegevenscontracten.
Gegevenscontracten
Een gegevenscontract is een abstracte beschrijving van een set velden met een naam en gegevenstype voor elk veld. Het gegevenscontract bestaat buiten een enkele implementatie, zodat services op verschillende platforms kunnen samenwerken. Zolang de gegevens die tussen de services worden doorgegeven, voldoen aan hetzelfde contract, kunnen alle services de gegevens verwerken. Deze verwerking wordt ook wel een losjes gekoppeld systeem genoemd. Een gegevenscontract is ook vergelijkbaar met een interface waarin het contract aangeeft hoe gegevens moeten worden geleverd, zodat deze kunnen worden verwerkt door een toepassing. Het gegevenscontract kan bijvoorbeeld een gegevenstype aanroepen met de naam 'Persoon' met twee tekstvelden, 'Voornaam' en 'Achternaam'. Als u een gegevenscontract wilt maken, past u de DataContractAttribute toe op de klasse en past u de DataMemberAttribute toe op de velden of eigenschappen die moeten worden geserialiseerd. Wanneer de gegevens worden geserialiseerd, voldoen de gegevens aan het gegevenscontract dat impliciet is ingebouwd in het type.
Note
Een gegevenscontract verschilt aanzienlijk van een echte interface in het gedrag van overerving. Interfaces worden overgenomen door eventuele afgeleide typen. Wanneer u de DataContractAttribute op een basisklasse toepast, nemen de afgeleide typen het kenmerk of het gedrag niet over. Als een afgeleid type echter een gegevenscontract heeft, worden de gegevensleden van de basisklasse geserialiseerd. U moet echter DataMemberAttribute toepassen op nieuwe leden in een afgeleide klasse opdat ze serialiseerbaar worden.
XML-schemadocumenten en het hulpprogramma SvcUtil
Als u gegevens uitwisselt met andere services, moet u het gegevenscontract beschrijven. Voor de huidige versie van de DataContractSerializerversie kan een XML-schema worden gebruikt om gegevenscontracten te definiëren. (Andere vormen van metagegevens/beschrijving kunnen voor hetzelfde doel worden gebruikt.) Als u een XML-schema wilt maken op basis van uw toepassing, gebruikt u het hulpprogramma hulpprogramma voor metagegevens van ServiceModel (Svcutil.exe) met de opdrachtregeloptie /dconly . Wanneer de invoer voor het hulpprogramma een assembly is, genereert het hulpprogramma standaard een set XML-schema's waarmee alle gegevenscontracttypen in die assembly worden gedefinieerd. Omgekeerd kunt u ook het hulpprogramma Svcutil.exe gebruiken om Visual Basic- of C#-klassedefinities te maken die voldoen aan de vereisten van XML-schema's die gebruikmaken van constructies die kunnen worden uitgedrukt door gegevenscontracten. In dit geval is de opdrachtregeloptie /dconly niet vereist.
Als de invoer voor het hulpprogramma Svcutil.exe een XML-schema is, maakt het hulpprogramma standaard een set klassen. Als u deze klassen bekijkt, merkt u dat de DataContractAttribute is toegepast. U kunt deze klassen gebruiken om een nieuwe toepassing te maken om gegevens te verwerken die moeten worden uitgewisseld met andere services.
U kunt het hulpprogramma ook uitvoeren op een eindpunt dat een WSDL-document (Web Services Description Language) retourneert om automatisch de code en configuratie te genereren om een WCF-client (Windows Communication Foundation) te maken. De gegenereerde code bevat typen die zijn gemarkeerd met de DataContractAttribute.
Bestaande typen opnieuw gebruiken
Een gegevenscontract heeft twee basisvereisten: een stabiele naam en een lijst met leden. De stabiele naam bestaat uit de naamruimte uniform resource identifier (URI) en de lokale naam van het contract. Wanneer u de DataContractAttribute klasse toepast op een klasse, wordt standaard de klassenaam gebruikt als de lokale naam en de naamruimte van de klasse (voorafgegaan door "http://schemas.datacontract.org/2004/07/") als de naamruimte-URI. U kunt de standaardinstellingen overschrijven door de Name en Namespace eigenschappen in te stellen. U kunt de naamruimte ook wijzigen door de ContractNamespaceAttribute naamruimte toe te passen op de naamruimte. Gebruik deze mogelijkheid wanneer u een bestaand type hebt dat gegevens precies op de gewenste manier verwerkt, maar een andere naamruimte en klassenaam heeft dan het gegevenscontract. Door de standaardwaarden te overschrijven, kunt u uw bestaande type opnieuw gebruiken en de geserialiseerde gegevens laten voldoen aan het gegevenscontract.
Note
In elke code kunt u het woord DataContract gebruiken in plaats van het langere DataContractAttribute.
Versioning
Een gegevenscontract kan ook geschikt zijn voor latere versies van zichzelf. Dat wil zeggen dat wanneer een latere versie van het contract extra gegevens bevat, die gegevens worden opgeslagen en geretourneerd aan een afzender ongewijzigd. Implementeer hiervoor de IExtensibleDataObject interface.
Zie Versiebeheer van datacontract voor meer informatie over versiebeheer.
Constructors
| Name | Description |
|---|---|
| DataContractAttribute() |
Initialiseert een nieuw exemplaar van de DataContractAttribute klasse. |
Eigenschappen
| Name | Description |
|---|---|
| IsNameSetExplicitly |
Hiermee wordt aangegeven of Name deze expliciet is ingesteld. |
| IsNamespaceSetExplicitly |
Hiermee wordt aangegeven of Namespace deze expliciet is ingesteld. |
| IsReference |
Hiermee wordt een waarde opgehaald of ingesteld die aangeeft of u objectverwijzingsgegevens wilt behouden. |
| IsReferenceSetExplicitly |
Hiermee wordt aangegeven of IsReference deze expliciet is ingesteld. |
| Name |
Stelt de naam van het gegevenscontract voor het type in of haalt deze op. |
| Namespace |
Hiermee haalt u de naamruimte voor het gegevenscontract op of stelt u deze in voor het type. |
| TypeId |
Wanneer deze wordt geïmplementeerd in een afgeleide klasse, krijgt u Attributehiervoor een unieke id. (Overgenomen van Attribute) |
Methoden
| Name | Description |
|---|---|
| Equals(Object) |
Retourneert een waarde die aangeeft of dit exemplaar gelijk is aan een opgegeven object. (Overgenomen van Attribute) |
| GetHashCode() |
Retourneert de hash-code voor dit exemplaar. (Overgenomen van Attribute) |
| GetType() |
Hiermee haalt u de Type huidige instantie op. (Overgenomen van Object) |
| IsDefaultAttribute() |
Wanneer deze wordt overschreven in een afgeleide klasse, geeft u aan of de waarde van dit exemplaar de standaardwaarde is voor de afgeleide klasse. (Overgenomen van Attribute) |
| Match(Object) |
Wanneer deze wordt overschreven in een afgeleide klasse, wordt een waarde geretourneerd die aangeeft of dit exemplaar gelijk is aan een opgegeven object. (Overgenomen van Attribute) |
| MemberwiseClone() |
Hiermee maakt u een ondiepe kopie van de huidige Object. (Overgenomen van Object) |
| ToString() |
Retourneert een tekenreeks die het huidige object vertegenwoordigt. (Overgenomen van Object) |
Expliciete interface-implementaties
| Name | Description |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Hiermee wordt een set namen toegewezen aan een bijbehorende set verzend-id's. (Overgenomen van Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Hiermee haalt u de typegegevens voor een object op, die kan worden gebruikt om de typegegevens voor een interface op te halen. (Overgenomen van Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Hiermee wordt het aantal type-informatieinterfaces opgehaald dat een object biedt (0 of 1). (Overgenomen van Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Biedt toegang tot eigenschappen en methoden die door een object worden weergegeven. (Overgenomen van Attribute) |