Sdílet prostřednictvím


Typy XML a ADO.NET v kontraktech dat

Model kontraktu dat WCF (Windows Communication Foundation) podporuje určité typy, které představují přímo XML. Pokud jsou tyto typy serializovány do XML, serializátor zapíše obsah XML těchto typů bez dalšího zpracování. Podporované typy jsou XmlElement, pole XmlNode (nikoliv samotný typ XmlNode), stejně jako typy, které implementují IXmlSerializable. Typy DataSet a DataTable a typy datových sad se běžně používají při programování databází. Tyto typy implementují IXmlSerializable rozhraní a jsou proto serializovatelné v modelu kontraktu dat. Některé zvláštní aspekty těchto typů jsou uvedeny na konci tohoto tématu.

Typy XML

Xml Element

Typ XmlElement je serializován pomocí jeho xml obsahu. Například při použití následujícího typu.

[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

Toto je serializováno do XML následujícím způsobem:

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

Všimněte si, že prvek <myDataMember> datového členu obalu je stále přítomen. Tento prvek v modelu kontraktu dat nelze odebrat. Serializátory, které zpracovávají tento model ( DataContractSerializer a NetDataContractSerializer) mohou generovat speciální atributy do tohoto elementu obálky. Tyto atributy zahrnují standardní atribut "nil" instance schématu XML (který umožňuje, aby XmlElement bylo null) a atribut "type" (umožňující polymorfní použití XmlElement). Následující atributy XML jsou také specifické pro WCF: "ID", "Ref", "Type" a "Assembly". Tyto atributy mohou být generovány pro podporu použití XmlElement s povoleným režimem zachování grafu objektu nebo s NetDataContractSerializer. (Další informace o režimu zachování objektového grafu naleznete v tématu Serializace a Deserializace.)

Pole nebo kolekce XmlElement jsou povoleny a jsou zpracovávány jako jakékoli jiné pole nebo kolekce. To znamená, že existuje element obálky pro celou kolekci a samostatný element obálky (podobný <myDataMember> v předchozím příkladu) pro každý XmlElement v poli.

Při deserializaci je deserializátorem z příchozího XML vytvořen objekt XmlElement. Platný nadřazený objekt XmlDocument je poskytován deserializátorem.

Ujistěte se, že fragment XML, který je deserializován na XmlElement, definuje všechny předpony, které používá, a nespoléhá se na žádné definice předpon z nadřazených prvků. Jedná se o problém pouze v případě, že přistupujete k XML pomocí DataContractSerializer z jiného (ne) DataContractSerializer zdroje.

Při použití s DataContractSerializer, XmlElement může být přiřazen polymorfně, ale pouze k datovému členu typu Object. I když implementuje IEnumerable, XmlElement nelze použít jako typ kolekce a nelze jej přiřadit datovému členu IEnumerable . Stejně jako u všech polymorfních přiřazení DataContractSerializer vygeneruje název kontraktu dat ve výsledném XML. V tomto případě je "XmlElement" v oboru názvů http://schemas.datacontract.org/2004/07/System.Xml.

S NetDataContractSerializer je podporováno jakékoliv platné polymorfní přiřazení XmlElement (do Object nebo IEnumerable).

Nepokoušejte se použít ani jeden z serializátorů s typy odvozenými z XmlElement, zda jsou přiřazeny polymorfně nebo ne.

Pole uzlů XmlNode

Použití polí XmlNode je velmi podobné použití XmlElement. Použití polí XmlNode poskytuje větší flexibilitu než použití XmlElement. Můžete vložit více prvků do obalujícího elementu datového členu. Můžete také vložit obsah jiný než prvky uvnitř elementu obtékání datového členu, například komentáře XML. Nakonec můžete atributy vložit do elementu obtékání datového členu. Toho lze dosáhnout naplněním pole XmlNode konkrétními odvozenými třídami XmlNode, jako je XmlAttribute, XmlElement nebo XmlComment. Například při použití následujícího typu.

[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

Při serializaci se výsledný kód XML podobá následujícímu kódu.

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

Všimněte si, že element <myDataMember> obálky datového členu obsahuje atribut, komentář a dva prvky. Jedná se o čtyři XmlNode instance, které byly serializovány.

Pole XmlNode , které má za následek neplatný kód XML, nelze serializovat. Například pole dvou XmlNode instancí, kde první z nich je XmlElement a druhý je XmlAttribute, je neplatné, protože tato sekvence neodpovídá žádné platné instanci XML (neexistuje žádné místo pro připojení atributu).

Při deserializaci pole XmlNode, uzly jsou vytvořeny a naplněny informacemi z příchozí XML. Platný nadřazený objekt XmlDocument je poskytován deserializátorem. Všechny uzly jsou deserializovány, včetně všech atributů v elementu datového členu obálky, ale s výjimkou atributů umístěných v serializátorech WCF (například atributy použité k označení polymorfní přiřazení). Upozornění o definování všech předpon oboru názvů v fragmentu XML platí pro deserializaci polí XmlNode, stejně jako pro deserializaci XmlElement.

Při použití serializátorů při zapnutém zachování grafu objektů je rovnost objektů zachována pouze na úrovni XmlNode polí, nikoli na jednotlivých XmlNode instancích.

Nepokoušejte se serializovat pole XmlNode, ve kterém je jeden nebo více uzlů nastaveno na null hodnotu. Je povoleno, aby null byl celý prvek pole, ale nikoliv pro žádný jednotlivý XmlNode obsažený v poli. Pokud má celý člen pole hodnotu null, element datového členu obálky obsahuje speciální atribut, který označuje, že má hodnotu null. Při deserializaci se celý člen pole také změní na hodnotu null.

Pouze pravidelná pole XmlNode jsou serializátorem zpracovávána speciálně. Datové členy deklarované jako jiné typy kolekce, které obsahují XmlNode, nebo datové členy deklarované jako pole typů odvozených z XmlNode, nejsou zpracovávány speciálně. Nejsou tedy obvykle serializovatelné, pokud také nesplňují jedno z dalších kritérií pro serializaci.

Pole nebo kolekce polí typu XmlNode jsou povoleny. Pro celou kolekci je element obálky a samostatný element obálky (podobný <myDataMember> v předchozím příkladu) pro každé pole XmlNode ve vnějším poli nebo kolekci.

Naplnění datového člena typu ArrayObject nebo ArrayIEnumerable instancemi XmlNode nemá za následek, že se datový člen považuje za ArrayXmlNode instance. Každý člen pole je serializován samostatně.

Při použití s DataContractSerializer mohou být polí XmlNode přiřazena polymorfně, ale pouze do datového členu typu Object. I když implementuje IEnumerable, pole XmlNode nelze použít jako typ kolekce a přiřadit ho datovému členu IEnumerable . Stejně jako u všech polymorfních přiřazení DataContractSerializer vygeneruje název kontraktu dat ve výsledném XML – v tomto případě je to ArrayOfXmlNode v http://schemas.datacontract.org/2004/07/System.Xml oboru názvů. Při použití s NetDataContractSerializer se podporuje jakékoli platné přiřazení pole XmlNode.

Důležité informace o schématu

Podrobnosti o mapování schématu typů XML naleznete v tématu Referenční informace ke schématu kontraktu dat. Tato část obsahuje souhrn důležitých bodů.

Datový člen typu XmlElement je mapován na prvek definovaný pomocí následujícího anonymního typu.

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

Datový člen typu Array of XmlNode je mapován na prvek definovaný pomocí následujícího anonymního typu.

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

Typy implementace rozhraní IXmlSerializable

Typy, které implementují rozhraní IXmlSerializable, jsou plně podporovány DataContractSerializer. Atribut XmlSchemaProviderAttribute by měl být vždy použit u těchto typů pro řízení jejich schématu.

Existují tři odrůdy typů, které implementují IXmlSerializable: typy, které představují libovolný obsah, typy, které představují jeden prvek, a starší DataSet typy.

  • Typy obsahu používají metodu zprostředkovatele schématu určenou atributem XmlSchemaProviderAttribute . Metoda nevrací null, a vlastnost IsAny atributu je ponechána ve své výchozí hodnotě false. Toto je nejběžnější použití IXmlSerializable typů.

  • Typy elementů se používají, když typ musí určovat vlastní název kořenového elementu IXmlSerializable. Chcete-li označit typ jako typ elementu, buď nastavte IsAny vlastnost atributu XmlSchemaProviderAttribute na true nebo vrátit hodnotu null z metody zprostředkovatele schématu. Pro typy elementů je volitelná metoda zprostředkovatele schématu – místo názvu metody v poli XmlSchemaProviderAttributemůže být zadána hodnota null. Pokud je však IsAnytrue a je-li zadána metoda zprostředkovatele schématu, musí metoda vrátit hodnotu null.

  • Starší DataSet typy jsou IXmlSerializable typy, které nejsou označené atributem XmlSchemaProviderAttribute . Místo toho spoléhají na metodu GetSchema generování schématu. Tento model se používá pro DataSet typ a jeho typová datová sada odvozuje třídu v dřívějších verzích rozhraní .NET Framework, ale nyní je zastaralá a je podporována pouze ze starších důvodů. Nespoléhejte na tento vzor a vždy použijte XmlSchemaProviderAttribute na své IXmlSerializable typy.

Typy obsahu IXmlSerializable

Při serializaci datového členu typu, který implementuje IXmlSerializable a je typem obsahu definovaným dříve, serializátor zapíše obalový prvek pro datový člen a předá řízení metodě WriteXml. Implementace WriteXml může napsat libovolný XML, včetně přidání atributů do elementu obálky. Serializátor zavře prvek po dokončení WriteXml.

Při deserializaci datového členu typu, který implementuje IXmlSerializable a je typ obsahu definovaný dříve, deserializátor umístí čtenář XML na obalový element pro datový člen a předá řízení metodě ReadXml. Metoda musí číst celý prvek, včetně počáteční a koncové značky. Ujistěte se, že kód ReadXml zpracovává případ, kdy je element prázdný. Kromě toho by vaše ReadXml implementace neměla spoléhat na element obálky, který je pojmenován určitým způsobem. Název zvolený serializátorem se může lišit.

Je povoleno přiřazovat IXmlSerializable typy obsahu polymorfně, například datovým členům typu Object. Je také povoleno, aby instance typů měly hodnotu null. A konečně je možné použít IXmlSerializable typy s povoleným zachováním objektového grafu a s NetDataContractSerializer. Všechny tyto funkce vyžadují, aby serializátor WCF připojil určité atributy do elementu obálky ("nil" a "type" v oboru názvů instance schématu XML a "Id", "Ref", "Type" a "Assembly" v oboru názvů specifickém pro WCF).

Atributy, které se mají ignorovat při implementaci readXml

Před předáním řízení vašemu kódu ReadXml deserializátor prozkoumá element XML, zjistí tyto speciální atributy XML a provede příslušné kroky. Pokud je například "nil" true, hodnota null je deserializována a ReadXml není volána. Pokud je zjištěn polymorfismus, obsah prvku je deserializován, jako by to byl jiný typ. Implementace polymorfně přiřazeného typu ReadXml je volána. V každém případě by implementace měla tyto speciální atributy ignorovat, ReadXml protože jsou zpracovávány deserializátorem.

Úvahy o schématu pro typy obsahu IXmlSerializable

Při exportu schématu typu obsahu IXmlSerializable je aktivována metoda zprostředkovatele schématu. XmlSchemaSet je předán metodě poskytovatele schématu. Metoda může do sady schématu přidat jakékoli platné schéma. Sada schémat obsahuje schéma, které je již známo v době, kdy dojde k exportu schématu. Když musí metoda poskytovatele schématu přidat položku do souboru schématu, musí zjistit, zda v souboru už existuje XmlSchema s odpovídajícím oborem názvů. Pokud ano, metoda zprostředkovatele schématu musí přidat novou položku do existujícího XmlSchema. V opačném případě musí vytvořit novou XmlSchema instanci. To je důležité, pokud se používají pole typů IXmlSerializable . Například, pokud máte typ IXmlSerializable, který se exportuje jako typ "A" v oboru názvů "B", je možné, že v době, kdy je metoda zprostředkovatele schématu volána, sada schémat již obsahuje schéma pro "B" k držení typu "ArrayOfA".

Kromě přidání typů do objektu XmlSchemaSetmusí metoda zprostředkovatele schématu pro typy obsahu vrátit hodnotu, která není null. Může vrátit XmlQualifiedName název typu schématu, který se má pro daný IXmlSerializable typ použít. Tento kvalifikovaný název slouží také jako název datového kontraktu a jmenný prostor pro typ. Je povoleno vrátit typ, který v sadě schématu neexistuje okamžitě, když metoda zprostředkovatele schématu vrátí. Očekává se však, že když jsou všechny související typy exportovány (metoda Export je volána pro všechny relevantní typy na XsdDataContractExporter a vlastnost Schemas je přístupná), typ existuje v sadě schémat. Přístup k vlastnosti Schemas předtím, než byla provedena všechna relevantní volání Export, může vyústit v XmlSchemaException. Další informace o procesu exportu naleznete v tématu Export schémat z tříd.

Metoda zprostředkovatele schématu může také vrátit XmlSchemaType pro použití. Typ může nebo nemusí být anonymní. Pokud je typ anonymní, schéma pro daný IXmlSerializable typ se exportuje jako anonymní typ pokaždé, když je IXmlSerializable typ použit jako datový člen. Typ IXmlSerializable má stále název datového kontraktu a jmenný prostor. (Určuje se podle popisu v názvech kontraktů dat s tím rozdílem, že DataContractAttribute atribut nelze použít k přizpůsobení názvu.) Pokud není anonymní, musí to být jeden z typů v souboru XmlSchemaSet. Tento případ je ekvivalentem vrácení XmlQualifiedName typu.

Kromě toho je globální deklarace elementu exportována pro typ. Pokud typ nemá XmlRootAttribute atribut použitý na něm, element má stejný název a obor názvů jako datový kontrakt a jeho „nillable“ vlastnost je true. Jedinou výjimkou je obor názvů schématu (http://www.w3.org/2001/XMLSchema); pokud je datový kontrakt typu v tomto oboru názvů, odpovídající globální prvek je v prázdném oboru názvů, protože není zakázáno přidávat nové elementy do oboru názvů schématu. Pokud má typ XmlRootAttribute atribut použitý na něj, globální deklarace elementu je exportována pomocí následujících vlastností: ElementName, Namespacea IsNullable. S výchozími hodnotami s použitím XmlRootAttribute jsou název kontraktu dat, prázdný prostor názvů a atribut 'nillable' nastaven na hodnotu true.

Stejná pravidla deklarace globálních elementů platí pro starší typy datových sad. Všimněte si, že XmlRootAttribute nemůže přepsat globální deklarace elementů, které byly přidány prostřednictvím vlastního kódu, a to buď pomocí metody poskytovatele schématu do XmlSchemaSet, nebo prostřednictvím GetSchema pro starší typy datových sad.

IXmlSerializable: typy elementů

IXmlSerializable Typy elementů mají buď vlastnost nastavenou na IsAny, nebo jejich metoda poskytovatele schématu vrátí true.

Serializace a deserializace typu prvku je velmi podobná serializaci a deserializaci typu obsahu. Existují však některé důležité rozdíly:

  • Očekává se WriteXml , že implementace zapíše přesně jeden prvek (což může samozřejmě obsahovat více podřízených prvků). Neměly by být psány atributy mimo tento jediný prvek, více sourozeneckých prvků nebo smíšeného obsahu. Prvek může být prázdný.

  • Implementace ReadXml by neměla číst element obálky. Očekává se, že přečte jeden prvek, který WriteXml vytvoří.

  • Při pravidelné serializaci prvkového typu (například jako datový člen v datovém kontraktu) serializátor vytvoří obalový element před voláním WriteXml, podobně jako u obsahových typů. Při serializaci typu elementu na nejvyšší úrovni serializátor obvykle vůbec nevytvoří obalový prvek kolem elementu, který WriteXml zapisuje, pokud nebyl explicitně zadán kořenový název a obor názvů při vytváření serializátoru v konstruktoru DataContractSerializer nebo NetDataContractSerializer. Další informace naleznete v tématu Serializace a deserializace.

  • ** Při serializaci typu prvku na nejvyšší úrovni bez zadání kořenového názvu a oboru názvů při vytvoření, WriteStartObject a WriteEndObject v podstatě nedělají nic, zatímco WriteObjectContent volá WriteXml. V tomto režimu nemůže být serializovaný objekt null a nemůže být polymorfně přiřazen. Nelze také povolit zachování grafu objektů a nelze použít NetDataContractSerializer.

  • Při deserializaci typu prvku na nejvyšší úrovni bez zadání kořenového názvu a oboru názvů v době konstrukce, vrátí IsStartObjecttrue, pokud může najít začátek libovolného prvku. ReadObject s parametrem verifyObjectName nastaveným na true se chová stejným způsobem jako IsStartObject před skutečným načtením objektu. ReadObject pak předá řízení metodě ReadXml .

Schéma exportované pro typy prvků je stejné jako pro XmlElement typ, jak je popsáno v předchozí části, s tím rozdílem, že metoda zprostředkovatele schématu může přidat jakékoli další schéma jako XmlSchemaSet u typů obsahu. Použití atributu XmlRootAttribute s typy elementů není povoleno a globální deklarace elementů se pro tyto typy nikdy nevygenerují.

Rozdíly od XmlSerializeru

Rozhraní IXmlSerializable a atributy XmlSchemaProviderAttribute a XmlRootAttribute rozumí i XmlSerializer. Existují však určité rozdíly v tom, jak se s nimi v modelu kontraktu dat zachází. Důležité rozdíly jsou shrnuty v následujících příkladech:

  • Metoda zprostředkovatele schématu musí být veřejná, aby byla použitelná v objektu XmlSerializer, ale nemusí být veřejná, aby byla použitelná v modelu datového kontraktu.

  • Metoda zprostředkovatele schématu je volána, když IsAny je true v modelu kontraktu dat, ale bez XmlSerializer.

  • XmlRootAttribute Pokud atribut není k dispozici pro obsah nebo starší typy datových sad, XmlSerializer exportuje globální deklaraci elementu do prázdného oboru názvů. V datovém modelu kontraktu se obvykle používá obor názvů datového kontraktu, což je popsáno výše.

Mějte na paměti tyto rozdíly při vytváření typů, které se používají s oběma technologiemi serializace.

Importování schématu IXmlSerializable

Při importu schématu generovaného z IXmlSerializable typů existuje několik možností:

  • Vygenerované schéma může být platné schéma kontraktu dat, jak je popsáno v referenčních informacích ke schématu kontraktu dat. V tomto případě lze schéma importovat obvyklým způsobem a vygenerují se běžné typy datových kontraktů.

  • Vygenerované schéma nemusí být platným schématem kontraktu dat. Například vaše metoda zprostředkovatele schématu může generovat schéma, které zahrnuje atributy XML, které nejsou podporovány v modelu kontraktu dat. V tomto případě můžete schéma importovat jako IXmlSerializable typy. Tento režim importu není ve výchozím nastavení zapnutý, ale dá se snadno povolit – například s přepínačem příkazového /importXmlTypes řádku na nástroj ServiceModel Metadata Utility (Svcutil.exe). Toto je podrobně popsáno v importu schématu pro generování tříd. Všimněte si, že musíte pracovat přímo s XML pro instance typu. Můžete také zvážit použití jiné serializace technologie, která podporuje širší rozsah schématu – viz téma o použití XmlSerializer.

  • Možná budete chtít znovu použít existující IXmlSerializable typy v proxy serveru místo generování nových typů. V tomto případě lze funkci odkazovaných typů popsanou v tématu Importing Schema to Generate Types použít k označení typu, který se má použít. To odpovídá použití /reference přepínače svcutil.exe, který určuje sestavení, které obsahuje typy pro opakované použití.

Reprezentace libovolného XML v kontraktech dat

Pole XmlElement, pole XmlNode a typy IXmlSerializable umožňují vložit libovolné XML do modelu datového kontraktu. DataContractSerializer a NetDataContractSerializer předají tento obsah XML zapisovači XML, aniž by zasahovaly do procesu. Autoři XML však mohou vynutit určitá omezení na XML, které zapisují. Konkrétně tady je několik důležitých příkladů:

  • Zapisovače XML obvykle neumožňují deklaraci dokumentu XML (například <?xml version='1.0' ?>) uprostřed psaní jiného dokumentu. Úplný dokument XML nelze serializovat jako člen datového typu ArrayXmlNode. K tomu musíte buď odstranit deklaraci dokumentu, nebo použít vlastní schéma kódování k reprezentaci.

  • Všechny zapisovače XML dodané s WCF odmítají zpracovatelské instrukce XML (<?...?>) a definice typu dokumentu (<!...>), protože nejsou povoleny ve zprávách SOAP. Toto omezení můžete obejít pomocí vlastního mechanismu kódování. Pokud je musíte zahrnout do výsledného XML, můžete napsat vlastní kodér, který používá zapisovače XML, které je podporují.

  • Při implementaci WriteXmlse vyhněte volání WriteRaw metody pro zapisovač XML. WCF používá řadu kódování XML (včetně binárního souboru), je velmi obtížné nebo nemožné použít WriteRaw tak, aby výsledek byl použitelný v jakémkoli kódování.

  • Při implementaci WriteXml se vyhněte používání metod WriteEntityRef a WriteNmToken, které nejsou podporovány zapisovači XML poskytovanými WCF.

Použití datové sady, typové datové sady a datové tabulky

Použití těchto typů je plně podporováno v modelu kontraktu dat. Při použití těchto typů zvažte následující body:

  • Schéma pro tyto typy (zejména DataSet a jeho odvozené třídy) nemusí být interoperabilní s některými platformami, které nejsou WCF, nebo může mít za následek špatnou použitelnost při použití s těmito platformami. Použití DataSet typu může mít navíc vliv na výkon. Nakonec může být v budoucnosti obtížnější verzi vaší aplikace spravovat. Zkuste použít explicitně definované datové typy kontraktů místo typů DataSet ve vašich kontraktech.

  • Při importu DataSet nebo DataTable schématu je důležité na tyto typy odkazovat. Pomocí nástroje příkazového řádku Svcutil.exe to lze provést předáním názvu sestavení System.Data.dll přepínači /reference . Pokud importujete schéma typové datové sady, musíte odkazovat na typ datové sady. S Svcutil.exepředejte umístění sestavení typové datové sady do přepínače /reference. Další informace o odkazování na typy naleznete v tématu Importing Schema to Generate Classes.

Podpora typed DataSets v modelu kontraktu dat je omezená. Typové datové sady mohou být serializovány a deserializovány a mohou exportovat jejich schéma. Import schématu kontraktu dat však ze schématu nemůže vygenerovat nové typy typed DataSet, protože může znovu použít pouze existující typy. Pomocí přepínače Svcutil.exemůžete odkazovat na existující typovou datovou sadu /r . Pokud se pokusíte použít Svcutil.exe bez /r přepínače ve službě, která používá typovou datovou sadu, je automaticky vybrán alternativní serializátor (XmlSerializer). Pokud musíte použít DataContractSerializer a musíte vygenerovat datové sady ze schématu, můžete použít následující postup: vygenerujte typy typizovaných DataSetů (pomocí nástroje Xsd.exe s přepínačem /d ve službě), zkompilujte typy a pak na ně nasměrujte pomocí přepínače /r na Svcutil.exe.

Viz také