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 (ale ne XmlNode
samotný typ), stejně jako typy, které implementují IXmlSerializable. Typy DataSet a DataTable typy datových sad se běžně používají v programování databáze. 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 pomocí 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 datového členu <myDataMember>
obálky je stále k dispozici. 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 XmlElement
null
být ) a atribut "type" (umožňující XmlElement
použití polymorfně). 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í grafu objektů najdete 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 vytvořen XmlElement
deserializátorem z příchozího XML. Platný nadřazený objekt XmlDocument je poskytován deserializátorem.
Ujistěte se, že fragment XML, který je deserializován na XmlElement
definici všech předpon, které používá, a nespoléhá na žádné definice předpon z nadřazených prvků. Jedná se o problém pouze v případě, že používáte DataContractSerializer
přístup k XML z jiného (ne)DataContractSerializer
zdroje.
Při použití s DataContractSerializer
, XmlElement
může být přiřazen polymorfně, ale pouze datový člen 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 to XmlElement v http://schemas.datacontract.org/2004/07/System.Xml
oboru názvů.
NetDataContractSerializer
S , všechny platné polymorfní přiřazení XmlElement
(do Object
nebo IEnumerable
) je podporováno.
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 uzlu XmlNode
Použití polí XmlNode je velmi podobné použití XmlElement
. Použití polí XmlNode
poskytuje větší flexibilitu než použití XmlElement
. Do elementu obtékání datového členu můžete napsat více prvků. 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
s konkrétními odvozenými třídami XmlNode
, jako XmlAttributeje , XmlElement
nebo XmlComment. Například pomocí 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 a XmlElement
druhý je XmlAttribute 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í na definování všech předpon oboru názvů v fragmentu XML platí pro deserializaci polí XmlNode
stejně jako při deserializaci XmlElement
.
Při použití serializátorů se zapnutou zachováním objektového grafu je rovnost objektů zachována pouze na úrovni XmlNode
polí, nikoli na jednotlivých XmlNode
instancích.
Nepokoušejte se serializovat pole, ve XmlNode
kterém je jeden nebo více uzlů nastaveno na null
hodnotu . Je povoleno, aby null
byl celý člen pole , ale ne pro žádnou jednotlivou osobu XmlNode
obsaženou v matici. 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 běžná pole jsou zpracovávána XmlNode
speciálně serializátorem. 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í jsou povolena XmlNode
. 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 Array
IEnumerable
instancemi XmlNode
nemá za následek, že se datový člen považuje za Array
XmlNode
instance. Každý člen pole je serializován samostatně.
Při použití s DataContractSerializer
, pole XmlNode
mohou být přiřazeny polymorfně, ale pouze datový člen 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 polem NetDataContractSerializer
se podporuje jakékoli platné přiřazení XmlNode
pole.
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í IXmlSerializable
rozhraní, 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í anull
IsAny vlastnost 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í řídit vlastní název kořenového
IXmlSerializable
elementu. Chcete-li označit typ jako typ elementu, buď nastavte IsAny vlastnost atributu XmlSchemaProviderAttribute natrue
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 poliXmlSchemaProviderAttribute
může být zadána hodnota null. PokudIsAny
jetrue
však zadána metoda zprostředkovatele schématu, musí metoda vrátit hodnotu null.Starší DataSet typy jsou
IXmlSerializable
typy, které nejsou označené atributemXmlSchemaProviderAttribute
. Místo toho spoléhají na metodu GetSchema generování schématu. Tento model se používá proDataSet
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 uXmlSchemaProviderAttribute
svýchIXmlSerializable
typů.
Typy obsahu IXmlSerializable
Při serializaci datového členu typu, který implementuje IXmlSerializable
a je typ obsahu definovaný dříve, serializátor zapíše element obálky pro datový člen a předat řízení metodě WriteXml . Implementace WriteXml může napsat libovolný XML, včetně přidání atributů do elementu obálky. Po WriteXml
dokončení serializátor zavře prvek.
Při deserializaci datového členu typu, který implementuje IXmlSerializable
a je typ obsahu definovaný dříve, deserializátor umístí čtenář XML do elementu obálky pro datový člen a předat ří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 je 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 povolenou NetDataContractSerializerzachováním objektového grafu a s . 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 ovládacího prvku do kódu ReadXml
deserializátor prozkoumá element XML, zjistí tyto speciální atributy XML a působí na ně. 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. Polymorfně přiřazená implementace ReadXml
typu 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.
Důležité informace o schématu pro typy obsahu IXmlSerializable
Při exportu schématu IXmlSerializable
typu obsahu se volá metoda zprostředkovatele schématu. Předá XmlSchemaSet se metodě zprostředkovatele 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. Pokud metoda zprostředkovatele schématu musí přidat položku do sady schématu, musí určit, zda v sadě již existuje odpovídající XmlSchema obor 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
. Pokud máte IXmlSerializable
například typ, který se exportuje jako typ "A" v oboru názvů "B", je možné, že v době, kdy se metoda zprostředkovatele schématu nazývá sada schématu, již obsahuje schéma pro "B" pro ulož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 obor názvů 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 po exportu všech souvisejících typů ( Export metoda je volána pro všechny relevantní typy v a XsdDataContractExporterSchemas vlastnost je přístup), typ existuje v sadě schémat. Schemas
Přístup k vlastnosti před provedením všech relevantních Export
volání může vést k 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 metodu, která XmlSchemaType se má použít. Typ může nebo nemusí být anonymní. Pokud je anonymní, schéma pro IXmlSerializable
typ se exportuje jako anonymní typ při každém IXmlSerializable
použití typu jako datový člen. Typ IXmlSerializable
má stále název datového kontraktu a obor názvů. (Toto je určeno podle popisu v tématu Názvy kontraktů dat s výjimkou toho, ž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ěj, element má stejný název a obor názvů jako datový kontrakt a jeho "neillable" 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. Výchozí hodnoty použité XmlRootAttribute
jsou název kontraktu dat, prázdný obor názvů a hodnota true .
Stejná pravidla deklarace globálních elementů platí pro starší typy datových sad. Všimněte si, že XmlRootAttribute
nelze přepsat globální deklarace elementů přidané prostřednictvím vlastního kódu, buď přidány do XmlSchemaSet
metody zprostředkovatele schématu nebo prostřednictvím GetSchema
starších typů datových sad.
IXmlSerializable – typy elementů
IXmlSerializable
Typy elementů mají buď vlastnost nastavenou IsAny
nebo true
mají jejich zprostředkovatele schématu vrátit null
metodu .
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ělo by psát atributy mimo tento jediný prvek, více prvků na stejné úrovně nebo smíšený obsah. 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 serializaci typu prvku pravidelně (například jako datový člen v datovém kontraktu), serializátor před voláním
WriteXml
, jako u typů obsahu. Při serializaci typu elementu na nejvyšší úrovni serializátor obvykle nevypíše obálkový prvek vůbec 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 konstruktoruDataContractSerializer
neboNetDataContractSerializer
konstruktory. 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ů v době výstavby, WriteStartObject a WriteEndObject v podstatě nic a WriteObjectContent volání
WriteXml
. V tomto režimu nemůže být serializovaný objekt null a nemůže být polymorfně přiřazen. Zachování grafu objektů také nelze povolit a nelze hoNetDataContractSerializer
použít.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í
true
, IsStartObject pokud může najít začátek libovolného prvku. ReadObjectverifyObjectName
se sadou parametrů setrue
chová stejným způsobem jakoIsStartObject
před tím, než objekt skutečně načtete.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 XmlSchemaProviderAttribute
XmlRootAttribute
atributy jsou také pochopeny 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, pokud
IsAny
je true v modelu kontraktu dat, ale ne sXmlSerializer
.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 modelu kontraktu dat je použitý obor názvů obvykle obor názvů datového kontraktu, jak 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.
Import 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 pomocí přepínače 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í obsahující typy, které se mají znovu použít.
Reprezentace libovolného XML v kontraktech dat
Pole XmlElement
a IXmlSerializable
typy umožňují vložení libovolného XmlNode
XML do modelu kontraktu dat. Tento DataContractSerializer
obsah XML a NetDataContractSerializer
předejte ho do zapisovače XML, který se používá, aniž by v procesu zasahoval. Zapisovače XML však mohou vynutit určitá omezení 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. Nelze vzít úplný dokument XML a serializovat ho jako
Array
datový členXmlNode
. 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ítnout XML instrukce zpracování (<? ... ?>) 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
WriteXml
se 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žítWriteRaw
tak, aby výsledek byl použitelný v jakémkoli kódování.Při implementaci
WriteXml
se vyhněte použití WriteEntityRef a WriteNmToken metod, které nejsou podporovány u zapisovačů XML poskytovaných 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 pro vaši verzi aplikace v budoucnu obtížnější. Zvažte použití explicitně definovaných typů datových kontraktůDataSet
místo typů ve vašich kontraktech.Při importu
DataSet
neboDataTable
schématu je důležité na tyto typy odkazovat. Pomocí nástroje příkazového řádku Svcutil.exe toho lze dosáhnout 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. Při Svcutil.exe předejte do přepínače umístění sestavení/reference
typové datové sady. 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 na Svcutil.exe můžete odkazovat na existující typovou datovou /r
sadu. 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 je nutné použít DataContractSerializer a musí vygenerovat datové sady ze schématu, můžete použít následující postup: vygenerujte typy typed DataSet (pomocí nástroje Xsd.exe s přepínačem /d
ve službě), kompilujte typy a pak na ně přejděte pomocí /r
přepínače na Svcutil.exe.