XML- und ADO.NET-Typen in DatenverträgenXML and ADO.NET Types in Data Contracts

Das Windows Communication Foundation (WCF)Windows Communication Foundation (WCF)-Datenvertragsmodell unterstützt bestimmte Typen, die XML direkt darstellen.The Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) data contract model supports certain types that represent XML directly. Wenn diese Typen in XML serialisiert werden, schreibt das Serialisierungsprogramm den XML-Inhalt dieser Typen ohne weitere Verarbeitung.When these types are serialized to XML, the serializer writes out the XML contents of these types without any further processing. Unterstützte Typen sind XmlElement, XmlNode-Arrays (jedoch nicht der XmlNode-Typ selbst) sowie Typen, die IXmlSerializable implementieren.Supported types are XmlElement, arrays of XmlNode (but not the XmlNode type itself), as well as types that implement IXmlSerializable. Der DataSet- und DataTable-Typ sowie typisierte Datasets werden häufig bei der Datenbankprogrammierung verwendet.The DataSet and DataTable type, as well as typed datasets, are commonly used in database programming. Diese Typen implementieren die IXmlSerializable-Schnittstelle und sind deshalb im Datenvertragsmodell serialisierbar.These types implement the IXmlSerializable interface and are therefore serializable in the data contract model. Einige besondere Überlegungen zu diesen Typen sind am Ende dieses Themas aufgeführt.Some special considerations for these types are listed at the end of this topic.

XML-TypenXML Types

XML-ElementXml Element

Der XmlElement-Typ wird mit seinem XML-Inhalt serialisiert.The XmlElement type is serialized using its XML contents. Verwenden Sie z. B. den folgenden Typ:For example, using the following type.

[DataContract(Namespace=@"http://schemas.contoso.com")]
public class MyDataContract
{
    [DataMember]
    public XmlElement myDataMember;
    public void TestClass()
    {
        XmlDocument xd = new XmlDocument();
        myDataMember = xd.CreateElement("myElement");
        myDataMember.InnerText = "myContents";
        myDataMember.SetAttribute
         ("myAttribute","myValue");
    }
}
<DataContract([Namespace] := "http://schemas.contoso.com")>  _
Public Class MyDataContract
    <DataMember()>  _
    Public myDataMember As XmlElement
    
    Public Sub TestClass() 
        Dim xd As New XmlDocument()
        myDataMember = xd.CreateElement("myElement")
        myDataMember.InnerText = "myContents"
        myDataMember.SetAttribute("myAttribute", "myValue")
    
    End Sub 
End Class 

Die Serialisierung in XML wird wie folgt durchgeführt:This is serialized to XML as follows:

<MyDataContract xmlns="http://schemas.contoso.com">  
    <myDataMember>  
        <myElement xmlns="" myAttribute="myValue">  
            myContents  
        </myElement>  
    </myDataMember>  
</MyDataContract>  

Beachten Sie, dass immer noch das Wrapper-Datenmemberelement <myDataMember> vorhanden ist.Notice that a wrapper data member element <myDataMember> is still present. Es gibt keine Möglichkeit, dieses Element im Datenvertragsmodell zu entfernen.There is no way of removing this element in the data contract model. Die Serialisierungsprogramme, die dieses Modell verarbeiten (DataContractSerializer und NetDataContractSerializer), können spezielle Attribute in dieses Wrapperelement einfügen.The serializers that handle this model (the DataContractSerializer and NetDataContractSerializer) may emit special attributes into this wrapper element. Diese Attribute enthalten das standardmäßige XML-Schemainstanzattribut "nil" (damit das XmlElement null sein kann) und das Attribut "type" (damit das XmlElement polymorph verwendet werden kann).These attributes include the standard XML Schema Instance "nil" attribute (allowing the XmlElement to be null) and the "type" attribute (allowing XmlElement to be used polymorphically). Außerdem sind die folgenden XML-Attribute spezifisch für WCFWCF: "ID", "Ref", "Type" und "Assembly".Also, the following XML attributes are specific to WCFWCF: "Id", "Ref", "Type" and "Assembly". Diese Attribute können ausgegeben werden, um die Verwendung von XmlElement bei aktiviertem Objektdiagramm-Beibehaltungsmodus zu unterstützen, oder indem NetDataContractSerializer verwendet wird.These attributes may be emitted to support using the XmlElement with the object graph preservation mode enabled, or with the NetDataContractSerializer. (Weitere Informationen zu den Objektdiagramm-beibehaltungsmodus, finden Sie unter Serialisierung und Deserialisierung.)(For more information about the object graph preservation mode, see Serialization and Deserialization.)

Arrays oder Auflistungen von XmlElement sind zulässig und werden wie andere Arrays oder Auflistungen behandelt.Arrays or collections of XmlElement are allowed and are handled as any other array or collection. Es wird ein Wrapperelement für die gesamte Auflistung und ein separates Wrapperelement (auf ähnliche Weise wie <myDataMember> im vorherigen Beispiel) für jedes XmlElement im Array verwendet.That is, there is a wrapper element for the entire collection, and a separate wrapper element (similar to <myDataMember> in the preceding example) for each XmlElement in the array.

Bei der Deserialisierung erstellt das Deserialisierungsprogramm aus den eingehenden XML-Daten ein XmlElement.On deserialization, an XmlElement is created by the deserializer from the incoming XML. Ein gültiges übergeordnetes XmlDocument wird vom Deserialisierungsprogramm bereitgestellt.A valid parent XmlDocument is provided by the deserializer.

Stellen Sie sicher, dass für das XML-Fragment, das in ein XmlElement deserialisiert wird, alle verwendeten Präfixe definiert sind, und dass es nicht von den Präfixdefinitionen übergeordneter Elemente abhängig ist.Make sure that the XML fragment that is deserialized to an XmlElement defines all prefixes that it uses and does not rely on any prefix definitions from ancestor elements. Dies ist nur von Bedeutung, wenn Sie DataContractSerializer verwenden, um auf XML von einer anderen Quelle (als DataContractSerializer) zuzugreifen.This is a concern only when using the DataContractSerializer to access XML from a different (non-DataContractSerializer) source.

Bei Verwendung mit der DataContractSerializer, XmlElement möglicherweise polymorph zugewiesen werden, jedoch nur auf einen Datenmember vom Typ Object.When used with the DataContractSerializer, the XmlElement may be assigned polymorphically, but only to a data member of type Object. Auch wenn es IEnumerable implementiert, kann ein XmlElement nicht als Auflistungstyp verwendet und keinem IEnumerable-Datenmember zugeordnet werden.Even though it implements IEnumerable, an XmlElement cannot be used as a collection type and cannot be assigned to an IEnumerable data member. Wie bei allen polymorphen Zuweisungen der DataContractSerializer ausgibt, den den Datenvertragsnamen in der resultierenden XML – in diesem Fall ist "XmlElement" in der "http://schemas.datacontract.org/2004/07/System.Xml" Namespace.As with all polymorphic assignments, the DataContractSerializer emits the data contract name in the resulting XML – in this case, it is "XmlElement" in the "http://schemas.datacontract.org/2004/07/System.Xml" namespace.

Mit NetDataContractSerializer wird jede gültige polymorphe Zuweisung von XmlElement (zu Object oder IEnumerable) unterstützt.With the NetDataContractSerializer, any valid polymorphic assignment of XmlElement (to Object or IEnumerable) is supported.

Versuchen Sie nicht, eines der Serialisierungsprogramme in Verbindung mit Typen zu verwenden, die von XmlElement abgeleitet sind, ob polymorph oder auf andere Weise.Do not attempt to use either of the serializers with types derived from XmlElement, whether they are assigned polymorphically or not.

XmlNode-ArrayArray of XmlNode

Das Verwenden von XmlNode-Arrays ähnelt stark der Verwendung von XmlElement.Using arrays of XmlNode is very similar to using XmlElement. Wenn Sie XmlNode-Arrays verwenden, können Sie flexibler arbeiten, als wenn Sie XmlElement verwenden.Using arrays of XmlNode gives you more flexibility than using XmlElement. Sie können innerhalb des Datenmember-Wrapperelements mehrere Elemente schreiben.You can write multiple elements inside the data member wrapping element. Neben Elementen können Sie auch andere Inhalte in das Datenmember-Wrapperelement einfügen, zum Beispiel XML-Kommentare.You can also inject content other than elements inside of the data member wrapping element, such as XML comments. Außerdem können Sie bei Bedarf Attribute in das Datenmember-Wrapperelement einfügen.Finally, you can put attributes into the wrapping data member element. Sie können diese Schritte ausführen, indem Sie das XmlNode-Array mit spezifischen von XmlNode abgeleiteten Klassen auffüllen, zum Beispiel mit XmlAttribute, XmlElement oder XmlComment.All this can be achieved by populating the array of XmlNode with specific derived classes of XmlNode such as XmlAttribute, XmlElement or XmlComment. Verwenden Sie z. B. den folgenden Typ:For example, using the following type.

[DataContract(Namespace="http://schemas.contoso.com")]
public class MyDataContract
{
    [DataMember]
    public XmlNode[] myDataMember = new XmlNode[4];
    public void TestClass()
    {
        XmlDocument xd = new XmlDocument();
        XmlElement xe = xd.CreateElement("myElement");
        xe.InnerText = "myContents";
        xe.SetAttribute
         ("myAttribute","myValue");

        XmlAttribute atr = xe.Attributes[0];
        XmlComment cmnt = xd.CreateComment("myComment");

myDataMember[0] = atr;
myDataMember[1] = cmnt;
myDataMember[2] = xe;
myDataMember[3] = xe;
    }
}
<DataContract([Namespace] := "http://schemas.contoso.com")>  _
Public Class MyDataContract
    <DataMember()>  _
    Public myDataMember(3) As XmlNode
    
    Public Sub TestClass() 
        Dim xd As New XmlDocument()
        Dim xe As XmlElement = xd.CreateElement("myElement")
        xe.InnerText = "myContents"
        xe.SetAttribute("myAttribute", "myValue")
        
        Dim atr As XmlAttribute = xe.Attributes(0)
        Dim cmnt As XmlComment = xd.CreateComment("myComment")
        
        myDataMember(0) = atr
        myDataMember(1) = cmnt
        myDataMember(2) = xe
        myDataMember(3) = xe
    
    End Sub 
    
End Class 

Nach der Serialisierung sind die sich ergebenden XML-Daten folgendem Code ähnlich:When serialized, the resulting XML is similar to the following code.

<MyDataContract xmlns="http://schemas.contoso.com">  
  <myDataMember myAttribute="myValue">  
     <!--myComment-->  
     <myElement xmlns="" myAttribute="myValue">  
 myContents  
     </myElement>  
     <myElement xmlns="" myAttribute="myValue">  
       myContents  
     </myElement>  
  </myDataMember>  
</MyDataContract>  

Beachten Sie, dass das Datenmember-Wrapperelement <myDataMember> ein Attribut, einen Kommentar und zwei Elemente enthält.Note that the data member wrapper element <myDataMember> contains an attribute, a comment, and two elements. Dies sind die vier XmlNode-Instanzen, die serialisiert wurden.These are the four XmlNode instances that were serialized.

Ein XmlNode-Array, das zu ungültigen XML-Daten führen würde, kann nicht serialisiert werden.An array of XmlNode that results in invalid XML cannot be serialized. Ein Array mit zwei XmlNode-Instanzen, von der die erste ein XmlElement und die zweite ein XmlAttribute ist, ist zum Beispiel ungültig, da diese Folge keiner gültigen XML-Instanz entspricht (es gibt keine Möglichkeit, das Attribut anzufügen).For example, an array of two XmlNode instances where the first one is an XmlElement and the second one is an XmlAttribute is invalid, because this sequence does not correspond to any valid XML instance (there is no place to attach the attribute to).

Bei der Deserialisierung eines XmlNode-Arrays werden Knoten erstellt und mit den Informationen aus den eingehenden XML-Daten aufgefüllt.On deserialization of an array of XmlNode, nodes are created and populated with information from the incoming XML. Ein gültiges übergeordnetes XmlDocument wird vom Deserialisierungsprogramm bereitgestellt.A valid parent XmlDocument is provided by the deserializer. Es werden alle Knoten deserialisiert. Dazu zählen auch alle Attribute im Datenmember-Wrapperelement, jedoch nicht die Attribute, die von den WCFWCF-Serialisierungsprogrammen dort angeordnet wurden (zum Beispiel die Attribute, die zum Angeben der polymorphen Zuweisung verwendet werden).All nodes are deserialized, including any attributes on the wrapper data member element, but excluding the attributes placed there by the WCFWCF serializers (such as the attributes used to indicate polymorphic assignment). Die Einschränkung in Bezug auf die Definition aller Namespacepräfixe im XML-Fragment gilt für die Deserialisierung von XmlNode-Arrays genauso, wie sie für die Deserialisierung von XmlElement gilt.The caveat about defining all namespace prefixes in the XML fragment applies to the deserialization of arrays of XmlNode just like it does to deserializing XmlElement.

Wenn Sie die Serialisierungsprogramme bei aktivierter Objektdiagrammbeibehaltung verwenden, wird die Objektgleichheit nur auf der Ebene der XmlNode-Arrays beibehalten, nicht für die einzelnen XmlNode-Instanzen.When using the serializers with object graph preservation turned on, object equality is only preserved on the level of XmlNode arrays, not individual XmlNode instances.

Versuchen Sie nicht, ein XmlNode-Array zu serialisieren, wenn einer oder mehrere Knoten auf null festgelegt sind.Do not attempt to serialize an array of XmlNode where one or more of the nodes is set to null. Es ist zulässig, dass das gesamte Array null ist, nicht jedoch ein einzelner XmlNode im Array.It is permitted for the entire array member to be null, but not for any individual XmlNode contained in the array. Wenn der gesamte Arraymember 0 ist, enthält das Datenmember-Wrapperelement ein spezielles Attribut, das diesen Nullwert angibt.If the entire array member is null, the wrapper data member element contains a special attribute that indicates that it is null. Bei der Deserialisierung wird auch der ganze Arraymember 0.On deserialization, the entire array member also becomes null.

Nur normale XmlNode-Arrays werden vom Serialisierungsprogramm besonders behandelt.Only regular arrays of XmlNode are treated specially by the serializer. Datenmember, die als andere, XmlNode enthaltende Auflistungstypen deklariert sind, oder Datenmember, die als Arrays von Typen deklariert sind, die von XmlNode abgeleitet sind, werden nicht besonders behandelt.Data members declared as other collection types that contain XmlNode, or data members declared as arrays of types derived from XmlNode, are not treated specially. Aus diesem Grund sind sie normalerweise nicht serialisierbar, es sei denn, sie erfüllen auch eines der Kriterien für die Serialisierbarkeit.Thus, they are normally not serializable unless they also meet one of the other criteria for serializing.

Arrays oder Auflistungen von Arrays von XmlNode sind zulässig.Arrays or collections of arrays of XmlNode are allowed. Es wird ein Wrapperelement für die gesamte Auflistung und ein separates Wrapperelement (auf ähnliche Weise wie <myDataMember> im Beispiel oben) für jedes XmlNode-Array im äußeren Array bzw. in der äußeren Auflistung verwendet.There is a wrapper element for the entire collection, and a separate wrapper element (similar to <myDataMember> in the preceding example) for each array of XmlNode in the outer array or collection.

Das Auffüllen eines Datenmembers vom Typ Array von Object oder Array von IEnumerable mit XmlNode-Instanzen führt nicht dazu, dass der Datenmember als Array mit XmlNode-Instanzen behandelt wird.Populating a data member of type Array of Object or Array of IEnumerable with XmlNode instances does not result in the data member being treated as an Array of XmlNode instances. Jeder Arraymember wird getrennt serialisiert.Each array member is serialized separately.

Bei der Verwendung mit DataContractSerializer können XmlNode-Arrays polymorph zugewiesen werden, jedoch nur für einen Datenmember vom Typ Object.When used with the DataContractSerializer, arrays of XmlNode can be assigned polymorphically, but only to a data member of type Object. Auch wenn es IEnumerable implementiert, kann ein XmlNode-Array nicht als Auflistungstyp verwendet und keinem IEnumerable-Datenmember zugeordnet werden.Even though it implements IEnumerable, an array of XmlNode cannot be used as a collection type and be assigned to an IEnumerable data member. Wie bei allen polymorphen Zuweisungen der DataContractSerializer ausgibt, den den Datenvertragsnamen in der resultierenden XML – in diesem Fall ist "ArrayOfXmlNode" in der "http://schemas.datacontract.org/2004/07/System.Xml" Namespace.As with all polymorphic assignments, the DataContractSerializer emits the data contract name in the resulting XML – in this case, it is "ArrayOfXmlNode" in the "http://schemas.datacontract.org/2004/07/System.Xml" namespace. Bei Verwendung mit der NetDataContractSerializer, jede gültige Zuweisung einer XmlNode Arrays werden unterstützt.When used with the NetDataContractSerializer, any valid assignment of an XmlNode array is supported.

SchemaüberlegungenSchema Considerations

Informationen zum Schema Zuordnen von XML-Typen finden Sie unter Datenvertrags-Schemareferenz.For details about the schema mapping of XML types, see Data Contract Schema Reference. Dieser Abschnitt enthält eine Zusammenfassung der wichtigen Punkte.This section provides a summary of the important points.

Ein Datenmember vom Typ XmlElement wird einem Element zugeordnet, das mithilfe des folgenden anonymen Typs definiert wurde.A data member of type XmlElement is mapped to an element defined using the following anonymous type.

<xsd:complexType>  
   <xsd:sequence>  
      <xsd:any minOccurs="0" processContents="lax" />  
   </xsd:sequence>  
</xsd:complexType>  

Ein Datenmember vom Typ XmlNode-Array wird einem Element zugeordnet, das mithilfe des folgenden anonymen Typs definiert wurde.A data member of type Array of XmlNode is mapped to an element defined using the following anonymous type.

<xsd:complexType mixed="true">  
   <xsd:sequence>  
      <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />  
   </xsd:sequence>  
   <xsd:anyAttribute/>  
</xsd:complexType>  

Typen, die die IXmlSerializable-Schnittstelle implementierenTypes Implementing the IXmlSerializable Interface

Typen, die die IXmlSerializable-Schnittstelle implementieren, werden von DataContractSerializer vollständig unterstützt.Types that implement the IXmlSerializable interface are fully supported by the DataContractSerializer. Sie sollten das XmlSchemaProviderAttribute-Attribut immer auf diese Typen anwenden, um das dazugehörige Schema zu steuern.The XmlSchemaProviderAttribute attribute should always be applied to these types to control their schema.

Es gibt drei Varianten von Typen, die IXmlSerializable implementieren: Typen, die beliebigen Inhalt darstellen, Typen, die ein einzelnes Element darstellen, und ältere DataSet-Typen.There are three varieties of types that implement IXmlSerializable: types that represent arbitrary content, types that represent a single element, and legacy DataSet types.

  • Inhaltstypen verwenden eine vom XmlSchemaProviderAttribute-Attribut angegebene Schemaanbietermethode.Content types use a schema provider method specified by the XmlSchemaProviderAttribute attribute. Die Methode gibt nicht null zurück, und die IsAny-Eigenschaft des Attributs wird auf ihrem Standardwert false belassen.The method does not return null, and the IsAny property on the attribute is left at its default value of false. Dies ist die häufigste Verwendung von IXmlSerializable-Typen.This is the most common usage of IXmlSerializable types.

  • Elementtypen werden verwendet, wenn ein IXmlSerializable-Typ seinen eigenen Stammelementnamen kontrollieren muss.Element types are used when an IXmlSerializable type must control its own root element name. Um einen Typ als Elementtyp zu kennzeichnen, legen Sie entweder die IsAny-Eigenschaft des XmlSchemaProviderAttribute-Attributs auf true fest, oder geben Sie über die Schemaanbietermethode 0 zurück.To mark a type as an element type, either set the IsAny property on the XmlSchemaProviderAttribute attribute to true or return null from the schema provider method. Die Verwendung einer Schemaanbietermethode ist für Elementtypen optional. Sie können unter XmlSchemaProviderAttribute anstatt des Methodennamens auch NULL angeben.Having a schema provider method is optional for element types – you may specify null instead of the method name in the XmlSchemaProviderAttribute. Wenn IsAny jedoch true ist und eine Schemaanbietermethode angegeben ist, muss die Methode NULL zurückgeben.However, if IsAny is true and a schema provider method is specified, the method must return null.

  • Bei älteren DataSet-Typen handelt es sich um IXmlSerializable-Typen, die nicht mit dem XmlSchemaProviderAttribute-Attribut gekennzeichnet sind.Legacy DataSet types are IXmlSerializable types that are not marked with the XmlSchemaProviderAttribute attribute. Stattdessen verwenden sie zur Schemagenerierung die GetSchema-Methode.Instead, they rely on the GetSchema method for schema generation. Dieses Muster wird für den DataSet-Typ und seine von ihm abgeleiteten typisierten Dataset-Klassen in älteren Versionen von .NET Framework verwendet. Es ist jedoch veraltet und wird nur aus Legacygründen noch unterstützt.This pattern is used for the DataSet type and its typed dataset derives a class in earlier versions of the .NET Framework, but is now obsolete and is supported only for legacy reasons. Verlassen Sie sich nicht auf dieses Muster, und wenden Sie immer das XmlSchemaProviderAttribute auf Ihre IXmlSerializable-Typen an.Do not rely on this pattern and always apply the XmlSchemaProviderAttribute to your IXmlSerializable types.

IXmlSerializable-InhaltstypenIXmlSerializable Content Types

Wenn Sie einen Datenmember eines Typs serialisieren, der IXmlSerializable implementiert und ein wie vorher definierter Inhaltstyp ist, schreibt das Serialisierungsprogramm das Wrapperelement für den Datenmember und übergibt die Steuerung an die WriteXml-Methode.When serializing a data member of a type that implements IXmlSerializable and is a content type as defined previously, the serializer writes the wrapper element for the data member and pass control to the WriteXml method. Die WriteXml-Implementierung kann beliebige XML-Daten schreiben, auch zum Hinzufügen der Attribute zum Wrapperelement.The WriteXml implementation can write any XML, including adding attributes to the wrapper element. Nachdem WriteXml abgeschlossen ist, schließt das Serialisierungsprogramm das Element.After WriteXml is done, the serializer closes the element.

Wenn Sie einen Datenmember eines Typs deserialisieren, der IXmlSerializable implementiert und ein wie vorher definierter Inhaltstyp ist, ordnet das Deserialisierungsprogramm den XML-Reader im Wrapperelement für den Datenmember an und übergibt die Steuerung an die ReadXml-Methode.When deserializing a data member of a type that implements IXmlSerializable and is a content type as defined previously, the deserializer positions the XML reader on the wrapper element for the data member and pass control to the ReadXml method. Die Methode muss das ganze Element lesen, einschließlich des Start- und Endtags.The method must read the entire element, including the start and end tags. Stellen Sie sicher, dass der ReadXml-Code auch den Fall verarbeitet, in dem das Element leer ist.Make sure your ReadXml code handles the case where the element is empty. Außerdem sollte sich Ihre ReadXml-Implementierung nicht darauf verlassen, dass das Wrapperelement einen bestimmten Namen aufweist.Additionally, your ReadXml implementation should not rely on the wrapper element being named a particular way. Der Name wird vom Serialisierungsprogramm ausgewählt und kann variieren.The name is chosen by the serializer can vary.

Es ist zulässig, IXmlSerializable-Inhaltstypen polymorph zuzuweisen, zum Beispiel zu Datenmembern vom Typ Object.It is permitted to assign IXmlSerializable content types polymorphically, for example, to data members of type Object. Es ist auch zulässig, dass die Typinstanzen NULL sind.It is also permitted for the type instances to be null. Außerdem ist es möglich, IXmlSerializable-Typen bei aktivierter Objektdiagrammbeibehaltung und mit NetDataContractSerializer zu verwenden.Finally, it is possible to use IXmlSerializable types with object graph preservation enabled and with the NetDataContractSerializer. Diese Features erfordern es, dass das WCFWCF-Serialisierungsprogramm bestimmte Attribute in das Wrapperelement einfügt ("nil" und "type" im XML-Schemainstanznamespace und "Id", "Ref", "Type" und "Assembly" in einem WCFWCF-spezifischen Namespace).All these features require the WCFWCF serializer to attach certain attributes into the wrapper element ("nil" and "type" in the XML Schema Instance namespace and "Id", "Ref", "Type" and "Assembly" in a WCFWCF-specific namespace).

Bei der Implementierung von ReadXml zu ignorierende AttributeAttributes to Ignore when Implementing ReadXml

Bevor die Steuerung an Ihren ReadXml-Code übergeben wird, untersucht das Deserialisierungsprogramm das XML-Element, erkennt diese speziellen XML-Attribute und führt die erforderlichen Aktionen aus.Before passing control to your ReadXml code, the deserializer examines the XML element, detects these special XML attributes, and acts on them. Wenn "nil" zum Beispiel true ist, wird ein Nullwert deserialisiert, und ReadXml wird nicht aufgerufen.For example, if "nil" is true, a null value is deserialized and ReadXml is not called. Falls Polymorphie erkannt wird, wird der Inhalt des Elements deserialisiert, als ob es sich um einen anderen Typ handeln würde.If polymorphism is detected, the contents of the element are deserialized as if it was a different type. Die ReadXml-Implementierung des polymorph zugewiesenen Typs wird aufgerufen.The polymorphically assigned type’s implementation of ReadXml is called. Eine ReadXml-Implementierung sollte diese speziellen Attribute auf jeden Fall ignorieren, da sie vom Deserialisierungsprogramm verarbeitet werden.In any case, a ReadXml implementation should ignore these special attributes because they are handled by the deserializer.

Schemaüberlegungen für IXmlSerializable-InhaltstypenSchema Considerations for IXmlSerializable Content Types

Beim Exportieren eines Schemas aus einem IXmlSerializable-Inhaltstyp wird die Schemaanbietermethode aufgerufen.When exporting schema an IXmlSerializable content type, the schema provider method is called. Ein XmlSchemaSet wird an die Schemaanbietermethode übergeben.An XmlSchemaSet is passed to the schema provider method. Die Methode kann dem Schemasatz gültige Schemas hinzufügen.The method can add any valid schema to the schema set. Der Schemasatz enthält das Schema, das zum Zeitpunkt des Schemaexports bereits bekannt ist.The schema set contains the schema that is already known at the time when schema export occurs. Wenn die Schemaanbietermethode dem Schemasatz ein Element hinzufügen muss, muss sie ermitteln, ob ein XmlSchema mit dem geeigneten Namespace im Satz bereits vorhanden ist.When the schema provider method must add an item to the schema set, it must determine if an XmlSchema with the appropriate namespace already exists in the set. Falls dies der Fall ist, muss die Schemaanbietermethode das neue Element dem vorhandenen XmlSchema hinzufügen.If it does, the schema provider method must add the new item to the existing XmlSchema. Andernfalls muss sie eine neue XmlSchema-Instanz erstellen.Otherwise, it must create a new XmlSchema instance. Dies ist wichtig, wenn Arrays mit IXmlSerializable-Typen verwendet werden.This is important if arrays of IXmlSerializable types are being used. Wenn Sie zum Beispiel über einen IXmlSerializable-Typ verfügen, der als Typ "A" in Namespace "B" exportiert wird, ist es möglich, dass der Schemasatz beim Aufrufen der Schemaanbietermethode das Schema "B" bereits enthält, um den Typ "ArrayOfA" aufzunehmen.For example, if you have an IXmlSerializable type that gets exported as type "A" in namespace "B", it is possible that by the time the schema provider method is called the schema set already contains the schema for "B" to hold the "ArrayOfA" type.

Zusätzlich zum Hinzufügen von Typen zum XmlSchemaSet muss die Schemaanbietermethode für Inhaltstypen einen anderen Wert als NULL zurückgeben.In addition to adding types to the XmlSchemaSet, the schema provider method for content types must return a non-null value. Sie kann ein XmlQualifiedName-Element zurückgeben, das den Namen des Schematyps angibt, der für den jeweiligen IXmlSerializable-Typ verwendet wird.It can return an XmlQualifiedName that specifies the name of the schema type to use for the given IXmlSerializable type. Dieser qualifizierte Name dient auch als Datenvertragsname und Namespace für den Typ.This qualified name also serves as the data contract name and namespace for the type. Es ist zulässig, einen Typ zurückzugeben, der nicht im Schemasatz vorhanden ist, wenn dies direkt nach der Rückgabe der Schemaanbietermethode erfolgt.It is permitted to return a type that does not exist in the schema set immediately when the schema provider method returns. Es wird jedoch vorausgesetzt, dass der Typ nach dem Export aller verwandten Typen (die Export-Methode wird für alle relevanten Typen von XsdDataContractExporter aufgerufen, und es wird auf die Schemas-Eigenschaft zugegriffen) im Schemasatz vorhanden ist.However, it is expected that by the time all related types are exported (the Export method is called for all relevant types on the XsdDataContractExporter and the Schemas property is accessed), the type exists in the schema set. Das Zugreifen auf die Schemas-Eigenschaft, bevor alle relevanten Export-Aufrufe durchgeführt wurden, kann zu einer XmlSchemaException führen.Accessing the Schemas property before all relevant Export calls have been made can result in an XmlSchemaException. Weitere Informationen zu den Exportprozess, finden Sie unter Exportieren von Schemas aus Klassen.For more information about the export process, see Exporting Schemas from Classes.

Die Schemaanbietermethode kann auch den zu verwendenden XmlSchemaType zurückgeben.The schema provider method can also return the XmlSchemaType to use. Der Typ kann anonym oder nicht anonym sein.The type may or may not be anonymous. Wenn er anonym ist, wird das Schema für den IXmlSerializable-Typ jeweils als anonymer Typ exportiert, wenn der IXmlSerializable-Typ als Datenmember verwendet wird.If it is anonymous, the schema for the IXmlSerializable type is exported as an anonymous type every time the IXmlSerializable type is used as a data member. Der IXmlSerializable-Typ verfügt trotzdem noch über einen Datenvertragsnamen und einen Namespace.The IXmlSerializable type still has a data contract name and namespace. (Dies wird bestimmt, wie in beschrieben Datenvertragsnamen mit dem Unterschied, dass die DataContractAttribute Attribut kann nicht zum Anpassen des Namens verwendet werden.) Wenn er nicht anonym ist, muss es sich um einen der Typen im XmlSchemaSet handeln.(This is determined as described in Data Contract Names except that the DataContractAttribute attribute cannot be used to customize the name.) If it is not anonymous, it must be one of the types in the XmlSchemaSet. Dies entspricht dem Zurückgeben von XmlQualifiedName für den Typ.This case is equivalent to returning the XmlQualifiedName of the type.

Zusätzlich wird für den Typ eine globale Elementdeklaration exportiert.Additionally, a global element declaration is exported for the type. Wenn auf den Typ nicht das XmlRootAttribute-Attribut angewendet wurde, weist das Element denselben Namen und Namespace wie der Datenvertrag auf, und seine "nil"-fähige Eigenschaft ist "true".If the type does not have the XmlRootAttribute attribute applied to it, the element has the same name and namespace as the data contract, and its "nillable" property is true. Die einzige Ausnahme hierbei ist der Schemanamespace ("http://www.w3.org/2001/XMLSchema") – Wenn Datenvertrag des Typs in diesem Namespace ist, ist das entsprechende globale Element im leeren Namespace, da es nicht zulässig ist, auf den Schemanamespace neue Elemente hinzuzufügen.The only exception to this is the schema namespace ("http://www.w3.org/2001/XMLSchema") – if the type’s data contract is in this namespace, the corresponding global element is in the blank namespace because it is forbidden to add new elements to the schema namespace. Wenn auf den Typ das XmlRootAttribute-Attribut angewendet wurde, wird die globale Elementdeklaration exportiert, indem Folgendes verwendet wird: die Eigenschaften ElementName, Namespace und IsNullable.If the type has the XmlRootAttribute attribute applied to it, the global element declaration is exported using the following: ElementName, Namespace and IsNullable properties. Die bei angewendetem XmlRootAttribute geltenden Standardeinstellungen sind der Datenvertragsname, ein leerer Namespace und der Wert "true" für die Nullfähigkeit ("nillable").The defaults with XmlRootAttribute applied are the data contract name, a blank namespace and "nillable" being true.

Die gleichen Regeln für die globale Elementdeklaration gelten für Legacy-Datasettypen.The same global element declaration rules apply to legacy dataset types. Beachten Sie, dass das XmlRootAttribute keine globalen Elementdeklarationen überschreiben kann, die mithilfe von benutzerdefiniertem Code hinzugefügt wurden. Diese können mithilfe der Schemaanbietermethode dem XmlSchemaSet oder über GetSchema für Legacy-Datasettypen hinzugefügt worden sein.Note that the XmlRootAttribute cannot override global element declarations added through custom code, either added to the XmlSchemaSet using the schema provider method or through GetSchema for legacy dataset types.

IXmlSerializable-ElementtypenIXmlSerializable Element Types

Für IXmlSerializable-Elementtypen ist entweder die IsAny-Eigenschaft auf true festgelegt, oder ihre Schemaanbietermethode gibt null zurück.IXmlSerializable element types have either the IsAny property set to true or have their schema provider method return null.

Das Serialisieren und Deserialisieren eines Elementtyps ähnelt stark dem Serialisieren und Deserialisieren eines Inhaltstyps.Serializing and deserializing an element type is very similar to serializing and deserializing a content type. Es gibt jedoch einige wichtige Unterschiede:However, there are some important differences:

  • Von der WriteXml-Implementierung wird erwartet, dass sie genau ein Element schreibt (das natürlich mehrere untergeordnete Elemente enthalten kann).The WriteXml implementation is expected to write exactly one element (which could of course contain multiple child elements). Sie sollte keine Attribute außerhalb dieses einzelnen Elements, mehrerer gleichgeordneter Elemente oder gemischten Inhalts schreiben.It should not be writing attributes outside of this single element, multiple sibling elements or mixed content. Das Element ist ggf. leer.The element may be empty.

  • Die ReadXml-Implementierung sollte das Wrapperelement nicht lesen.The ReadXml implementation should not read the wrapper element. Es wird erwartet, dass sie das einzelne Element liest, das von WriteXml erzeugt wird.It is expected to read the one element that WriteXml produces.

  • Wenn das Serialisierungsprogramm regelmäßig einen Elementtyp serialisiert (zum Beispiel als Datenmember in einem Datenvertrag), gibt das Serialisierungsprogramm ein Wrapperelement aus, bevor WriteXml aufgerufen wird. Dies entspricht der Vorgehensweise bei Inhaltstypen.When serializing an element type regularly (for example, as a data member in a data contract), the serializer outputs a wrapper element before calling WriteXml, as with content types. Bei der Serialisierung eines Elementtyps auf der obersten Ebene gibt das Serialisierungsprogramm normalerweise jedoch kein Wrapperelement für das Element aus, das WriteXml schreibt. Dies ist nur der Fall, wenn beim Erstellen des Serialisierungsprogramms in den Konstruktoren DataContractSerializer oder NetDataContractSerializer explizit ein Stammname und ein Namespace angegeben wurde.However, when serializing an element type at the top level, the serializer does not normally output a wrapper element at all around the element that WriteXml writes, unless a root name and namespace were explicitly specified when constructing the serializer in the DataContractSerializer or NetDataContractSerializer constructors. Weitere Informationen finden Sie unter Serialisierung und Deserialisierung.For more information, see Serialization and Deserialization.

  • Beim Serialisieren eines Elementtyps auf der obersten Ebene, ohne zur Entwurfszeit den Stammnamen und einen Namespace anzugeben, führen WriteStartObject und WriteEndObject im Wesentlichen keine Aktionen aus, und WriteObjectContent ruft einfach WriteXml auf.When serializing an element type at the top level without specifying the root name and namespace at construction time, WriteStartObject and WriteEndObject essentially does nothing and WriteObjectContent calls WriteXml. In diesem Modus kann das Objekt, das serialisiert wird, nicht NULL sein und nicht polymorph zugewiesen werden.In this mode, the object being serialized cannot be null and cannot be polymorphically assigned. Außerdem kann die Objektdiagrammbeibehaltung nicht aktiviert und NetDataContractSerializer kann nicht verwendet werden.Also, object graph preservation cannot enabled and the NetDataContractSerializer cannot be used.

  • Beim Deserialisieren eines Elementtyps auf der obersten Ebene, ohne zur Entwurfszeit den Stammnamen und den Namespace anzugeben, gibt IsStartObject den Wert true zurück, wenn der Anfang eines beliebigen Elements gefunden werden kann.When deserializing an element type at the top level without specifying the root name and namespace at construction time, IsStartObject returns true if it can find the start of any element. ReadObject mit auf verifyObjectName festgelegtem true-Parameter verhält sich genau so wie IsStartObject, bevor das Objekt gelesen wird.ReadObject with the verifyObjectName parameter set to true behaves in the same way as IsStartObject before actually reading the object. ReadObject übergibt das Steuerelement dann an die ReadXml-Methode.ReadObject then passes control to ReadXml method.

Das Schema, das für die Elementtypen exportiert wird, entspricht dem Schema für den XmlElement-Typ, wie in einem Abschnitt weiter oben beschrieben. Es gilt jedoch die Ausnahme, dass die Schemaanbietermethode wie bei Inhaltstypen dem XmlSchemaSet zusätzliche Schemas hinzufügen kann.The schema exported for element types is the same as for the XmlElement type as described in an earlier section, except that the schema provider method can add any additional schema to the XmlSchemaSet as with content types. Das Verwenden des XmlRootAttribute-Attributs mit Elementtypen ist nicht zulässig, und globale Elementdeklarationen werden für diese Typen nicht ausgegeben.Using the XmlRootAttribute attribute with element types is not allowed, and global element declarations are never emitted for these types.

Unterschiede zu XmlSerializerDifferences from the XmlSerializer

Die IXmlSerializable-Schnittstelle und das XmlSchemaProviderAttribute- und XmlRootAttribute-Attribut werden vom XmlSerializer auch verstanden.The IXmlSerializable interface and the XmlSchemaProviderAttribute and XmlRootAttribute attributes are also understood by the XmlSerializer . Aber es gibt einige Unterschiede dabei, wie diese Elemente im Datenvertragsmodell behandelt werden.However, there are some differences in how these are treated in the data contract model. Die wichtigsten Unterschiede werden im Folgenden zusammengefasst:The important differences are summarized in the following:

  • Die Schemaanbietermethode muss öffentlich sein, um im XmlSerializer verwendet werden zu können. Sie muss jedoch nicht öffentlich sein, um im Datenvertragsmodell verwendet werden zu können.The schema provider method must be public to be usable in the XmlSerializer, but does not have to be public to be usable in the data contract model.

  • Die Schemaanbietermethode wird aufgerufen, wenn für IsAny im Datenvertragsmodell "true" gilt, jedoch nicht für den XmlSerializer.The schema provider method is called when IsAny is true in the data contract model but not with the XmlSerializer.

  • Wenn das XmlRootAttribute-Attribut für Inhalts- oder Legacy-Datasettypen nicht vorhanden ist, exportiert der XmlSerializer eine globale Elementdeklaration in den leeren Namespace.When the XmlRootAttribute attribute is not present for content or legacy dataset types, the XmlSerializer exports a global element declaration in the blank namespace. Im Datenvertragsmodell ist der verwendete Namespace normalerweise der Datenvertragsnamespace, wie bereits beschrieben.In the data contract model, the namespace used is normally the data contract namespace as described earlier.

Beachten Sie diese Unterschiede, wenn Sie Typen erstellen, die mit beiden Serialisierungstechnologien verwendet werden.Be aware of these differences when creating types that are used with both serialization technologies.

Importieren von IXmlSerializable-SchemasImporting IXmlSerializable Schema

Beim Importieren eines Schemas, das aus IXmlSerializable-Typen generiert wurde, gibt es verschiedene Möglichkeiten:When importing a schema generated from IXmlSerializable types, there are a few possibilities:

  • Dem generierten Schema kann ein gültiges datenvertragsschema handeln, wie in beschrieben Datenvertrags-Schemareferenz.The generated schema may be a valid data contract schema as described in Data Contract Schema Reference. In diesem Fall kann das Schema auf die übliche Weise importiert werden, und es werden normale Datenvertragstypen generiert.In this case, schema can be imported as usual and regular data contract types are generated.

  • Bei dem generierten Schema kann es sich auch um ein nicht gültiges Datenvertragsschema handeln.The generated schema may not be a valid data contract schema. Ihre Schemaanbietermethode kann zum Beispiel Schemas mit XML-Attributen generieren, die im Datenvertragsmodell nicht unterstützt werden.For example, your schema provider method may generate schema that involves XML attributes which are not supported in the data contract model. In diesem Fall können Sie das Schema als IXmlSerializable-Typen importieren.In this case, you can import the schema as IXmlSerializable types. Dieser Modus "Import" ist nicht standardmäßig aktiviert, jedoch kann problemlos mit aktiviert werden – z. B. die /importXmlTypes Befehlszeilenoption, um die ServiceModel Metadata Utility Tool (Svcutil.exe).This import mode is not on by default but can easily be enabled – for example, with the /importXmlTypes command-line switch to the ServiceModel Metadata Utility Tool (Svcutil.exe). Dies wird ausführlich beschrieben unter der Importieren von Schemas zum Generieren von Klassen.This is described in detail in the Importing Schema to Generate Classes. Beachten Sie, dass Sie für die Typinstanzen direkt mit den XML-Daten arbeiten müssen.Note that you must work directly with the XML for your type instances. Sie können auch erwägen, eine andere Serialisierungstechnologie zu verwenden, die einen größeren Schemabereich unterstützt. Weitere Informationen finden Sie im Thema zur Verwendung von XmlSerializer.You may also consider using a different serialization technology that supports a wider range of schema – see the topic on using the XmlSerializer.

  • Es ist ratsam, Ihre vorhandenen IXmlSerializable-Typen im Proxy wiederzuverwenden, anstatt neue zu generieren.You may want to reuse your existing IXmlSerializable types in the proxy instead of generating new ones. In diesem Fall können Sie die Funktion mit den referenzierten Typen verwenden, die im Thema zum Importieren von Schemas zum Generieren von Typen beschrieben ist, um den wiederzuverwendenden Typ anzugeben.In this case, the referenced types feature described in the Importing Schema to Generate Types topic can be used to indicate the type to reuse. Dies entspricht dem Verwenden der /reference Schalters von svcutil.exe, der die Assembly angibt, die die wiederzuverwendenden Typen enthält.This corresponds to using the /reference switch on svcutil.exe, which specifies the assembly that contains the types to reuse.

Darstellen von beliebigen XML-Daten in DatenverträgenRepresenting Arbitrary XML in Data Contracts

Mithilfe der Typen XmlElement, XmlNode-Array und IXmlSerializable können Sie beliebige XML-Daten in das Datenvertragsmodell einfügen.The XmlElement, Array of XmlNode and IXmlSerializable types allow you to inject arbitrary XML into the data contract model. DataContractSerializer und NetDataContractSerializer übergeben diesen XML-Inhalt an den verwendeten XML-Writer, ohne dabei den Prozess zu beeinträchtigen.The DataContractSerializer and NetDataContractSerializer pass this XML content on to the XML writer in use, without interfering in the process. Die XML-Writer können jedoch bestimmte Einschränkungen für die XML-Daten erzwingen, die sie schreiben.However, the XML writers may enforce certain restrictions on the XML that they write. Unten sind einige wichtige Beispiele aufgeführt:Specifically, here are some important examples:

  • Die XML-Writer nicht in der Regel eine XML-Dokumentdeklaration zulassen (z. B. <? Xml Version = "1.0'? >) in der Mitte, schreiben ein anderes Dokument.The XML writers do not typically allow an XML document declaration (for example, <?xml version=’1.0’ ?>) in the middle of writing another document. Sie können kein vollständiges XML-Dokument als Array-XmlNode für einen Datenmember serialisieren.You cannot take a full XML document and serialize it as an Array of XmlNode data member. Dazu müssen Sie entweder die Dokumentdeklaration entfernen oder Ihr eigenes Codierungsschema für die Darstellung verwenden.To do this, you have to either strip out the document declaration or use your own encoding scheme to represent it.

  • Alle XML-Writer mit bereitgestellten WCFWCF weisen XML-verarbeitungsanweisungen (<?All of the XML writers supplied with WCFWCF reject XML processing instructions (<? ? >) und Dokumenttypdefinitionen (<!?>) and document type definitions (<! >), da sie in der SOAP-Nachrichten nicht zulässig sind.>), because they are not allowed in SOAP messages. Auch hier können Sie Ihren eigenen Codierungsmechanismus verwenden, um diese Einschränkung zu umgehen.Again, you can use your own encoding mechanism to get around this restriction. Wenn Sie dies in die sich ergebenden XML-Daten einfügen müssen, können Sie einen benutzerdefinierten Encoder schreiben, der XML-Writer mit der entsprechenden Unterstützung verwendet.If you must include these in your resultant XML, you can write a custom encoder that uses XML writers that support them.

  • Wenn Sie WriteXml implementieren, sollten Sie es vermeiden, die WriteRaw-Methode für den XML-Writer aufzurufen.When implementing WriteXml, avoid calling WriteRaw method on the XML writer. WCFWCF verwendet verschiedene XML-Codierungen (einschließlich binär), sodass es sehr schwierig bzw. nahezu unmöglich ist, WriteRaw so zu verwenden, dass das Ergebnis für jede Codierung verwendbar ist. uses a variety of XML encodings (including binary), it is very difficult or impossible to use WriteRaw such that the result is usable in any encoding.

  • Vermeiden Sie beim Implementieren von WriteXml die Verwendung der Methoden WriteEntityRef und WriteNmToken, die von den mitgelieferten XML-Writern von WCFWCF nicht unterstützt werden.When implementing WriteXml, avoid using the WriteEntityRef and WriteNmToken methods that are unsupported on the XML writers supplied with WCFWCF.

Verwenden von DataSet, typisiertem DataSet und DataTableUsing DataSet, Typed DataSet and DataTable

Die Verwendung dieser Typen wird im Datenvertragsmodell vollständig unterstützt.Using these types is fully supported in the data contract model. Beachten Sie beim Verwenden dieser Typen die folgenden Punkte:When using these types, consider the following points:

  • Das Schema für diese Typen (vor allem DataSet und die zugehörigen abgeleiteten typisierten Klassen) ist möglicherweise nicht interoperabel mit einigen Nicht-WCFWCF-Plattformen oder kann bei Verwendung dieser Plattformen deutliche Einschränkungen aufweisen.The schema for these types (especially DataSet and its typed derived classes) may not be interoperable with some non-WCFWCF platforms, or may result in poor usability when used with these platforms. Außerdem kann die Verwendung des DataSet-Typs zu Leistungseinbußen führen.Additionally, using the DataSet type may have performance implications. Zudem kann es das Versehen Ihrer Anwendung mit einer Versionsangabe erschweren.Finally, it may make it more difficult for you to version your application in the future. Sie können erwägen, anstelle von DataSet-Typen in Ihren Verträgen explizit definierte Datenvertragstypen zu verwenden.Consider using explicitly defined data contract types instead of DataSet types in your contracts.

  • Beim Importieren von DataSet- oder DataTable-Schemas ist es wichtig, auf diese Typen zu verweisen.When importing DataSet or DataTable schema, it is important to reference these types. Mit dem Befehlszeilentool Svcutil.exe, dies geschieht durch Übergeben der Assemblyname "System.Data.dll", um die /reference wechseln.With the Svcutil.exe command-line tool, this can be accomplished by passing the System.Data.dll assembly name to the /reference switch. Wenn Sie typisierte Datasetschemas importieren, müssen Sie auf den Typ des typisierten Datasets verweisen.If importing typed dataset schema, you must reference the typed dataset’s type. Mit Svcutil.exe, übergeben Sie den Speicherort der Assembly das typisierte Dataset, um die /reference wechseln.With Svcutil.exe, pass the location of the typed dataset’s assembly to the /reference switch. Weitere Informationen zum Verweisen auf Typen, finden Sie unter der Importieren von Schemas zum Generieren von Klassen.For more information about referencing types, see the Importing Schema to Generate Classes.

Die Unterstützung typisierter DataSets im Datenvertragsmodell ist beschränkt.Support for typed DataSets in the data contract model is limited. Typisierte DataSets können serialisiert und deserialisiert werden und können ihr Schema exportieren.Typed DataSets can be serialized and deserialized and can export their schema. Jedoch kann der Datenvertragsschemaimport keine neuen typisierte Dataset-Typen aus dem Schema generieren, sondern nur schon vorhandene wiederverwenden.However, the Data Contract schema import is unable to generate new typed DataSet types from the schema, as it can only reuse existing ones. Sie können mithilfe des /r-Schalters von Svcutil.exe auf ein vorhandenes typisiertes DataSet verweisen.You can point to an existing typed DataSet by using the /r switch on Svcutil.exe. Wenn Sie versuchen, Svcutil.exe ohne den /r-Schalter für einen Dienst einzusetzen, der ein typisiertes DataSet verwendet, wird automatisch ein alternatives Serialisierungsprogramm (XmlSerializer) ausgewählt.If you attempt to use a Svcutil.exe without the /r switch on a service that uses a typed dataset, an alternative serializer (XmlSerializer) is automatically selected. Wenn Sie den DataContractSerializer verwenden und DataSets aus dem Schema generieren müssen, können Sie zu dem folgenden Verfahren greifen: Generieren Sie die typisierten DataSet-Typen (indem Sie das Tool Xsd.exe mit dem Schalter /d für den Dienst verwenden), kompilieren Sie die Typen, und verweisen Sie dann mithilfe des /r-Schalters von Svcutil.exe auf diese Typen.If you must use the DataContractSerializer and must generate DataSets from schema, you can use the following procedure: generate the typed DataSet types (by using the Xsd.exe tool with the /d switch on the service), compile the types, and then point to them using the /r switch on Svcutil.exe.

Siehe auchSee Also

DataContractSerializer
IXmlSerializable
Verwenden von DatenverträgenUsing Data Contracts
Vom Datenvertragsserialisierer unterstützte TypenTypes Supported by the Data Contract Serializer