XML- és ADO.NET-típusok az adatszerződésekben
A Windows Communication Foundation (WCF) adatszerződési modellje támogatja az XML-t közvetlenül képviselő bizonyos típusokat. Ha ezek a típusok XML-fájlba vannak szerializálva, a szerializáló további feldolgozás nélkül kiírja ezeknek a típusoknak az XML-tartalmát. A támogatott típusok a XmlElementkövetkezők: tömbök XmlNode (de nem maga a XmlNode
típus), valamint a megvalósító IXmlSerializabletípusok. A DataSet típust és DataTable a beírt adatkészleteket gyakran használják az adatbázis-programozásban. Ezek a típusok implementálják az IXmlSerializable
interfészt, ezért szerializálhatók az adatszerződés-modellben. Az ilyen típusok néhány speciális szempontja a jelen témakör végén található.
XML-típusok
Xml-elem
A XmlElement
típus az XML-tartalma alapján szerializálva van. Használja például a következő típust.
[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
Ez az alábbi XML-fájlra van szerializálva:
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Figyelje meg, hogy a burkoló adatelem <myDataMember>
továbbra is jelen van. Ezt az elemet nem lehet eltávolítani az adatszerződés-modellből. A modellt ( DataContractSerializer és NetDataContractSerializer) kezelő szerializálók speciális attribútumokat bocsáthatnak ki ebbe a burkolóelembe. Ezek az attribútumok közé tartozik a standard XML-sémapéldány "nil" attribútuma (amely lehetővé teszi, XmlElement
hogy null
legyen) és a "type" attribútum (lehetővé téve XmlElement
a polimorfikus használatát). Emellett a következő XML-attribútumok a WCF-re vonatkoznak: "Id", "Ref", "Type" és "Assembly". Ezek az attribútumok kibocsáthatók, hogy támogassák az XmlElement
objektumdiagram-megőrzési mód engedélyezését, vagy a NetDataContractSerializer. (Az objektumdiagram-megőrzési módról további információt a Szerializálás és deszerializálás.)
A tömbök vagy gyűjtemények XmlElement
engedélyezettek, és bármely más tömbként vagy gyűjteményként kezelhetők. Ez azt jelzi, hogy a teljes gyűjteményhez tartozik burkolóelem, és egy külön burkolóelem (az előző példához <myDataMember>
hasonlóan) a tömb minden egyes XmlElement
eleméhez.
Deszerializálás esetén a deszerializáló létrehoz egy XmlElement
fájlt a bejövő XML-fájlból. A deszerializáló érvényes szülőt XmlDocument biztosít.
Győződjön meg arról, hogy a deszerializált XmlElement
XML-töredék definiálja az általa használt összes előtagot, és nem támaszkodik az előtag-definíciókra az őselemekből. Ez csak akkor jelent problémát, ha egy DataContractSerializer
másik (nem) forrásból származó XML-hezDataContractSerializer
való hozzáférést használja.
A használatával a DataContractSerializer
XmlElement
rendszer polimorfikusan rendelhető hozzá, de csak a típushoz Objecttartozó adattaghoz. Annak ellenére, hogy implementálja IEnumerable, nem XmlElement
használható gyűjteménytípusként, és nem rendelhető hozzá egy IEnumerable adattaghoz. Az összes polimorf hozzárendeléshez hasonlóan az DataContractSerializer
adatszerződés nevét is kibocsátja az eredményül kapott XML-fájlban. Ebben az esetben ez az "XmlElement" a http://schemas.datacontract.org/2004/07/System.Xml
névtérben.
A program támogatja a NetDataContractSerializer
(vagy Object
IEnumerable
) érvényes polimorfikus hozzárendelését XmlElement
.
Ne kísérelje meg a szerializálók egyikét sem olyan típusokkal használni, amelyekből származik XmlElement
, függetlenül attól, hogy polimorfikusan vannak-e hozzárendelve.
XmlNode tömbje
A tömbök XmlNode használata nagyon hasonló a használathoz XmlElement
. A tömbök XmlNode
használata nagyobb rugalmasságot biztosít, mint a használata XmlElement
. Az adattagburkoló elemen belül több elemet is írhat. Az adattagburkoló elemen belüli elemeken kívül más tartalmakat is beszúrhat, például XML-megjegyzéseket. Végül attribútumokat helyezhet el a burkoló adatelemben. Mindez úgy érhető el, hogy a tömböt XmlNode
olyan meghatározott származtatott osztályokkal XmlNode
adhatja elő, mint XmlAttributepéldául az , XmlElement
vagy XmlComment. Használja például a következő típust.
[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
Szerializálva az eredményként kapott XML az alábbi kódhoz hasonló.
<MyDataContract xmlns="http://schemas.contoso.com">
<myDataMember myAttribute="myValue">
<!--myComment-->
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
<myElement xmlns="" myAttribute="myValue">
myContents
</myElement>
</myDataMember>
</MyDataContract>
Vegye figyelembe, hogy az adatelem burkolóeleme <myDataMember>
egy attribútumot, egy megjegyzést és két elemet tartalmaz. Ez a négy XmlNode
szerializált példány.
Érvénytelen XML-értéket eredményező XmlNode
tömb nem szerializálható. Például egy két XmlNode
példányból álló tömb, amelyben az első egy XmlElement
, a második XmlAttribute pedig érvénytelen, mert ez a sorozat nem felel meg egyetlen érvényes XML-példánynak sem (nincs hely az attribútum csatolására).
Csomópontok tömbjének XmlNode
deszerializálása során a rendszer létrehozza és feltölti a bejövő XML-ből származó információkat. A deszerializáló érvényes szülőt XmlDocument biztosít. Minden csomópont deszerializálva van, beleértve a burkoló adatelem bármely attribútumát, de a WCF szerializálók által oda helyezett attribútumokat (például a polimorf hozzárendelés jelzésére használt attribútumokat) kivéve. Az XML-töredékben lévő összes névtérelőtag meghatározására vonatkozó figyelmeztetés ugyanúgy vonatkozik a tömbök XmlNode
deszerializálására, mint a deszerializálásra XmlElement
.
Ha a szerializálókat bekapcsolt objektumdiagram-megőrzéssel használja, az objektumok egyenlősége XmlNode
csak tömbök szintjén marad meg, nem pedig egyedi XmlNode
példányokon.
Ne kíséreljen meg szerializálni egy tömböt XmlNode
, ahol egy vagy több csomópont be van állítva null
. A teljes tömbtag null
számára engedélyezett, de a tömbben található egyetlen személy XmlNode
esetében sem. Ha a teljes tömbtag null értékű, a burkoló adatelem egy speciális attribútumot tartalmaz, amely azt jelzi, hogy null. A deszerializálás során a teljes tömbtag is null értékű lesz.
A szerializáló csak normál tömböket XmlNode
kezel. A más gyűjteménytípusként XmlNode
deklarált adattagok vagy az abból XmlNode
származtatott típusok tömbjeként deklarált adattagokat a rendszer nem kezeli külön. Így általában nem szerializálhatók, hacsak nem felelnek meg a szerializálás egyéb feltételeinek is.
Tömbök vagy tömbgyűjtemények engedélyezettek XmlNode
. A teljes gyűjteményhez tartozik burkolóelem, a külső tömb vagy gyűjtemény minden tömbjének külön burkolóeleme XmlNode
(az előző példához <myDataMember>
hasonlóan).
A példányok típusának ArrayObject
vagy Array
típusának XmlNode
IEnumerable
adattagjainak feltöltése nem eredményezi, hogy az adattagot példányként Array
XmlNode
kezelik. Minden tömbtag külön van szerializálva.
A tömbök használata esetén a DataContractSerializer
tömbök XmlNode
polimorfikusan rendelhetők hozzá, de csak egy adattípushoz Object
. Annak ellenére, hogy implementálja IEnumerable
, egy tömb XmlNode
nem használható gyűjteménytípusként, és nem rendelhető hozzá egy IEnumerable
adattaghoz. Az összes polimorf hozzárendeléshez hasonlóan a DataContractSerializer
rendszer az adatszerződés nevét is kibocsátja az eredményül kapott XML-ben – ebben az esetben ez a névtérben a http://schemas.datacontract.org/2004/07/System.Xml
"ArrayOfXmlNode". A tömbök NetDataContractSerializer
bármely érvényes hozzárendelése XmlNode
támogatott.
Sémavezértek
Az XML-típusok sémaleképezésével kapcsolatos részletekért lásd : Adatszerződés sémahivatkozása. Ez a szakasz összefoglalja a fontos pontokat.
A típus XmlElement
adattagja a következő névtelen típussal definiált elemre van leképezve.
<xsd:complexType>
<xsd:sequence>
<xsd:any minOccurs="0" processContents="lax" />
</xsd:sequence>
</xsd:complexType>
A Tömb XmlNode
típusú adattag egy, a következő névtelen típussal definiált elemre van leképezve.
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
</xsd:sequence>
<xsd:anyAttribute/>
</xsd:complexType>
Az IXmlSerializable Interfészt implementáló típusok
Az interfészt IXmlSerializable
megvalósító típusok teljes mértékben támogatottak a DataContractSerializer
. Az XmlSchemaProviderAttribute attribútumot mindig alkalmazni kell ezekre a típusokra a sémájuk szabályozásához.
Három típustípus implementálható IXmlSerializable
: tetszőleges tartalmat képviselő típusok, egyetlen elemet képviselő típusok és örökölt DataSet típusok.
A tartalomtípusok az attribútum által megadott sémaszolgáltatói
XmlSchemaProviderAttribute
módszert használják. A metódus nem ad visszanull
, és az IsAny attribútum tulajdonsága az alapértelmezett értékenfalse
marad. Ez a típusok leggyakoribb használataIXmlSerializable
.Az elemtípusok akkor használatosak, ha egy
IXmlSerializable
típusnak szabályoznia kell a saját gyökérelemnevét. Ha elemtípusként szeretne megjelölni egy típust, állítsa az IsAnyXmlSchemaProviderAttribute attribútum tulajdonságát null értékretrue
, vagy adja vissza a null értéket a sémaszolgáltató metódusból. A sémaszolgáltatói metódus használata nem kötelező elemtípusok esetén – a metódus neve helyett null értéket adhat meg aXmlSchemaProviderAttribute
. Ha azonban igentrue
,IsAny
és meg van adva sémaszolgáltatói metódus, a metódusnak null értéket kell visszaadnia.Az örökölt DataSet típusok olyan
IXmlSerializable
típusok, amelyek nincsenek megjelölve azXmlSchemaProviderAttribute
attribútummal. Ehelyett a GetSchema sémagenerálás módszerére támaszkodnak. Ez a minta aDataSet
típushoz használatos, és a gépelt adatkészlet a .NET-keretrendszer korábbi verzióiban egy osztályt hoz létre, de mára elavult, és csak örökölt okokból támogatott. Ne támaszkodjon erre a mintára, és mindig alkalmazza aXmlSchemaProviderAttribute
típusokraIXmlSerializable
.
IXmlSerializable tartalomtípusok
A korábban definiált tartalomtípust megvalósító IXmlSerializable
és tartalomtípusú adattag szerializálásakor a szerializáló megírja az adattag burkolóelemét, és átadja a vezérlőt a WriteXml metódusnak. Az WriteXml implementáció bármilyen XML-fájlt írhat, beleértve attribútumok hozzáadását a burkolóelemhez. Miután WriteXml
elkészült, a szerializáló bezárja az elemet.
A korábban definiált tartalomtípust megvalósító IXmlSerializable
és tartalomtípusú adattag deszerializálásakor a deszerializáló az XML-olvasót az adattag burkolóelemére továbbítja, és átadja a vezérlőt a ReadXml metódusnak. A metódusnak be kell olvasnia a teljes elemet, beleértve a kezdő és a záró címkét is. Győződjön meg arról, hogy a ReadXml
kód kezeli azt az esetet, ahol az elem üres. Emellett az ReadXml
implementáció nem támaszkodhat arra, hogy a burkolóelemet egy adott módon nevezik el. A szerializáló által választott név eltérő lehet.
A tartalomtípusok polimorfikusan rendelhetők hozzá IXmlSerializable
például a típus Objectadattagokhoz. A típuspéldányok null értékűek is lehetnek. Végül lehetőség van olyan típusok használatára IXmlSerializable
, amelyeken engedélyezve van az objektumdiagram megőrzése, és a NetDataContractSerializer. Mindezek a funkciók megkövetelik, hogy a WCF szerializáló bizonyos attribútumokat csatoljon a burkolóelemhez ("nil" és "type" az XML-sémapéldány névterében, valamint "Id", "Hiv", "Type" és "Assembly" egy WCF-specifikus névtérben).
A ReadXml megvalósításakor figyelmen kívül hagyandó attribútumok
Mielőtt átadja a vezérlőt a ReadXml
kódnak, a deszerializáló megvizsgálja az XML-elemet, észleli ezeket a speciális XML-attribútumokat, és cselekszik rajtuk. Ha például a "nulla" érték true
, akkor a null érték deszerializálva van, és ReadXml
nincs meghívva. Ha polimorfizmust észlel, az elem tartalma deszerializálva lesz, mintha más típusú lenne. A rendszer meghívja a polimorfikusan hozzárendelt típus implementációját ReadXml
. A implementációnak mindenesetre ReadXml
figyelmen kívül kell hagynia ezeket a speciális attribútumokat, mert azokat a deszerializáló kezeli.
Sémavezérek az IXmlSerializable tartalomtípusokhoz
A séma IXmlSerializable
tartalomtípus exportálásakor a rendszer meghívja a sémaszolgáltató metódust. A rendszer egy sémaszolgáltatói metódusnak ad át egy XmlSchemaSet elemet. A metódus bármilyen érvényes sémát hozzáadhat a sémakészlethez. A sémakészlet tartalmazza a sémaexportáláskor már ismert sémát. Ha a sémaszolgáltató metódusnak hozzá kell adnia egy elemet a sémakészlethez, meg kell állapítania, hogy létezik-e XmlSchema már megfelelő névtér a készletben. Ha igen, a sémaszolgáltató metódusnak hozzá kell adnia az új elemet a meglévőhöz XmlSchema
. Ellenkező esetben létre kell hoznia egy új XmlSchema
példányt. Ez akkor fontos, ha típustömböket IXmlSerializable
használ. Ha például olyan IXmlSerializable
típussal rendelkezik, amely "A" típusúként lesz exportálva a "B" névtérben, lehetséges, hogy a sémaszolgáltató metódusának meghívásakor a sémakészlet már tartalmazza a "B" sémáját a "ArrayOfA" típus tárolásához.
A tartalomtípusok sémaszolgáltatói metódusának a típusok XmlSchemaSethozzáadása mellett nem null értéket kell visszaadnia. Visszaadhat egy olyan értéket XmlQualifiedName , amely megadja az adott IXmlSerializable
típushoz használni kívánt sématípus nevét. Ez a minősített név egyben a típus adatszerződésének neve és névtere is. A sémaszolgáltatói metódus visszatérése után azonnal visszaadhat egy olyan típust, amely nem létezik a sémakészletben. Azonban várhatóan az összes kapcsolódó típus exportálása (a Export metódus meghívása az összes releváns típushoz XsdDataContractExporter és a Schemas tulajdonság eléréséhez) a sémakészletben is létezik. A tulajdonság elérése az Schemas
összes releváns Export
hívás XmlSchemaExceptionelőtt egy . Az exportálási folyamatról további információt a Sémák exportálása osztályokból című témakörben talál.
A sémaszolgáltató metódus a használni kívánt értéket is visszaadhatja XmlSchemaType . A típus lehet névtelen vagy nem. Ha névtelen, a rendszer a típus sémáját IXmlSerializable
névtelen típusként exportálja minden alkalommal, amikor a IXmlSerializable
típust adattagként használják. A IXmlSerializable
típus továbbra is rendelkezik adatszerződés nevével és névterével. (Ezt az alábbiakban leírtak szerint határozzuk meg: Adatszerződések nevei , kivéve, hogy az DataContractAttribute attribútum nem használható a név testreszabására.) Ha nem névtelen, akkor az egyik típusnak kell lennie a XmlSchemaSet
. Ez az eset egyenértékű a XmlQualifiedName
típus visszaadásával.
Emellett a típushoz egy globális elemdeklaráció is exportálva lesz. Ha a típus nem alkalmazza az XmlRootAttribute attribútumot, az elem neve és névtere megegyezik az adatszerződéssel, és a "nillable" tulajdonsága .true
Ez alól az egyetlen kivétel a sémanévtér (http://www.w3.org/2001/XMLSchema
); ha a típus adatszerződése ebben a névtérben van, a megfelelő globális elem az üres névtérben van, mert tilos új elemeket hozzáadni a sémanévtérhez. Ha a típushoz az XmlRootAttribute
attribútum van alkalmazva, a rendszer a következő tulajdonságok használatával exportálja a globális elemdeklarációt: ElementName, Namespaceés IsNullable. Az alkalmazott alapértelmezett értékek XmlRootAttribute
az adatszerződés neve, az üres névtér és a "nem olvasható" érték.
Ugyanezek a globális elemdeklarációs szabályok vonatkoznak az örökölt adathalmaztípusokra. Vegye figyelembe, hogy az XmlRootAttribute
egyéni kóddal hozzáadott globális elemdeklarációk nem bírálhatók felül, akár a XmlSchemaSet
sémaszolgáltatói metódussal, akár GetSchema
az örökölt adathalmaztípusok esetében.
IXmlSerializable elemtípusok
IXmlSerializable
az elemtípusok tulajdonsága vagy a IsAny
true
sémaszolgáltatói metódus visszatérési null
értéke.
Az elemtípusok szerializálása és deszerializálása nagyon hasonlít egy tartalomtípus szerializálásához és deszerializálásához. Van azonban néhány fontos különbség:
A
WriteXml
megvalósítás várhatóan pontosan egy elemet ír (amely természetesen több gyermekelemet is tartalmazhat). Nem szabad attribútumokat írni az egyetlen elemen, több testvérelemen vagy vegyes tartalomon kívül. Lehet, hogy az elem üres.Az
ReadXml
implementáció nem olvassa be a burkolóelemet. Várhatóan beolvassa azt az elemet, amely létrejönWriteXml
.Amikor rendszeresen szerializál egy elemtípust (például adatszerződés adattagjaként), a szerializáló a hívás
WriteXml
előtt egy burkoló elemet ad ki, a tartalomtípusokhoz hasonlóan. Ha azonban egy elemtípust a felső szinten szerializál, a szerializáló általában nem ad ki burkoló elemet az írottWriteXml
elem körül, kivéve, ha a szerializálóDataContractSerializer
vagyNetDataContractSerializer
konstruktorokban való létrehozásakor explicit módon meg lett adva gyökérnév és névtér. További információ: Szerializálás és deszerializálás.Amikor az elemtípust a legfelső szinten szerializálja anélkül, hogy a gyökérnevet és a névteret az építéskor adja meg, WriteStartObject és WriteEndObject lényegében semmit nem tesz, és WriteObjectContent nem hív
WriteXml
meg . Ebben a módban a szerializált objektum nem lehet null értékű, és nem rendelhető hozzá polimorfikusan. Emellett az objektumdiagramok megőrzése nem engedélyezhető, és nemNetDataContractSerializer
használható.Ha az elemtípust a legfelső szinten deszerializálja anélkül, hogy a gyökérnevet és a névteret az építéskor meg lenne adva, visszaadja
true
, IsStartObject ha bármilyen elem kezdetét megtalálja. ReadObject averifyObjectName
paraméter úgy van beállítva, hogytrue
ugyanúgy viselkedjen, mintIsStartObject
az objektum tényleges olvasása előtt.ReadObject
ezután átadja a vezérlést a metódusnakReadXml
.
Az elemtípusokhoz exportált séma megegyezik a XmlElement
korábbi szakaszban ismertetett típussal, azzal a kivétellel, hogy a sémaszolgáltató metódus bármilyen további sémát hozzáadhat a XmlSchemaSet tartalomtípusokhoz hasonlóan. XmlRootAttribute
Az attribútum elemtípusokkal való használata nem engedélyezett, és ezekhez a típusokhoz soha nem bocsát ki globális elemdeklarációkat.
Különbségek az XmlSerializertől
Az IXmlSerializable
interfészt és az XmlRootAttribute
XmlSchemaProviderAttribute
attribútumokat a XmlSerializer . Az adatszerződési modellben azonban vannak különbségek a kezelésük módjában. A fontos különbségeket az alábbiakban foglaljuk össze:
A sémaszolgáltató metódusának nyilvánosnak kell lennie ahhoz, hogy használható legyen az
XmlSerializer
adatszerződési modellben, de nem kell nyilvánosnak lennie.A sémaszolgáltató metódus akkor lesz meghívva, ha
IsAny
igaz az adatszerződés-modellben, de aXmlSerializer
.Ha az
XmlRootAttribute
attribútum nem található tartalom- vagy örökölt adathalmaz-típusok esetében, azXmlSerializer
üres névtérben exportál egy globális elemdeklarációt. Az adatszerződés-modellben a használt névtér általában a korábban ismertetett adatszerződés-névtér.
Vegye figyelembe ezeket a különbségeket a szerializálási technológiákkal használt típusok létrehozásakor.
IXmlSerializable séma importálása
A típusokból IXmlSerializable
létrehozott séma importálásakor van néhány lehetőség:
A létrehozott séma lehet érvényes adatszerződésséma az adatszerződés sémareferenciájában leírtak szerint. Ebben az esetben a séma a szokásos módon importálható, és rendszeres adatszerződés-típusok jönnek létre.
Előfordulhat, hogy a létrehozott séma nem érvényes adatszerződésséma. A sémaszolgáltatói metódus például olyan sémát hozhat létre, amely olyan XML-attribútumokat tartalmaz, amelyek nem támogatottak az adatszerződés-modellben. Ebben az esetben típusként
IXmlSerializable
importálhatja a sémát. Ez az importálási mód alapértelmezés szerint nincs bekapcsolva, de egyszerűen engedélyezhető – például a/importXmlTypes
parancssori kapcsolóval a ServiceModel Metadata Segédprogramra (Svcutil.exe). Ezt részletesen ismerteti a séma importálása osztályok létrehozásához. Vegye figyelembe, hogy közvetlenül a típuspéldányok XML-fájljával kell dolgoznia. Megfontolhatja egy másik szerializálási technológia használatát is, amely szélesebb sématartományt támogat – lásd a témakört aXmlSerializer
séma használatáról.Előfordulhat, hogy újak létrehozása helyett újra szeretné használni a meglévő
IXmlSerializable
típusokat a proxyban. Ebben az esetben az Importálási séma létrehozása típusok témakörében ismertetett hivatkozott típusok funkció használható az újrafelhasználandó típus jelzésére. Ez megfelel az/reference
svcutil.exe kapcsolójának, amely meghatározza az újrafelhasználandó típusokat tartalmazó szerelvényt.
Tetszőleges XML-t jelöl az adatszerződésekben
A XmlElement
tömb és IXmlSerializable
a XmlNode
típusok lehetővé teszik tetszőleges XML-fájl beszúrását az adatszerződési modellbe. NetDataContractSerializer
Ezt DataContractSerializer
az XML-tartalmat a használatban lévő XML-írónak adja át anélkül, hogy beavatkozik a folyamatba. Az XML-írók azonban bizonyos korlátozásokat alkalmazhatnak az általuk írt XML-fájlra. Konkrétan íme néhány fontos példa:
Az XML-írók általában nem engedélyezik az XML-dokumentum deklarációját (például <?xml version='1.0' ?>) egy másik dokumentum írása közben. Nem vehet fel teljes XML-dokumentumot, és nem szerializálhatja adattagként
Array
XmlNode
. Ehhez vagy le kell csíkolnia a dokumentumdeklarációt, vagy saját kódolási sémát kell használnia annak megjelenítéséhez.A WCF-hez megadott összes XML-író elutasítja az XML-feldolgozási utasításokat (<? ... ?>) és a dokumentumtípus-definíciókat (<! ... >), mert nem engedélyezettek a SOAP-üzenetekben. A korlátozás megkerüléséhez használhatja a saját kódolási mechanizmusát is. Ha ezeket bele kell foglalnia az eredményül kapott XML-fájlba, írhat egy egyéni kódolót, amely azokat támogató XML-írókat használ.
Implementáláskor
WriteXml
kerülje a metódus meghívását WriteRaw az XML-írón. A WCF számos XML-kódolást használ (beleértve a binárist is), nagyon nehéz vagy lehetetlen olyan módon használniWriteRaw
, hogy az eredmény bármilyen kódolásban használható legyen.Implementáláskor
WriteXml
kerülje a WriteEntityRef WCF-hez mellékelt XML-írókon nem támogatott és WriteNmToken nem támogatott metódusok használatát.
DataSet, Typed DataSet és DataTable használata
Az ilyen típusok használata teljes mértékben támogatott az adatszerződés-modellben. Az ilyen típusok használatakor vegye figyelembe a következő szempontokat:
Előfordulhat, hogy az ilyen típusú sémák (különösen DataSet a típusalapú származtatott osztályok) nem működnek együtt néhány nem WCF-platformmal, vagy a platformokkal való használat során rossz használhatóságot eredményezhetnek. Emellett a
DataSet
típus használata teljesítménybeli következményekkel is járhat. Végül megnehezítheti az alkalmazás jövőbeni verziószámba igénylését. Fontolja meg a kifejezetten meghatározott adatszerződés-típusok használatát a szerződésekben szereplő típusok helyettDataSet
.Importáláskor
DataSet
vagyDataTable
séma esetén fontos, hogy ezekre a típusokra hivatkozzon. A Svcutil.exe parancssori eszközzel ezt úgy teheti meg, hogy átadja a System.Data.dll szerelvény nevét a/reference
kapcsolónak. A beírt adathalmazséma importálásakor hivatkoznia kell a beírt adathalmaz típusára. A Svcutil.exe adja át a gépelt adathalmaz szerelvényének helyét a/reference
kapcsolónak. A hivatkozási típusokról további információt az Osztályok létrehozása séma importálása című témakörben talál.
Az adatszerződési modellbe beírt adathalmazok támogatása korlátozott. A gépelt adathalmazok szerializálhatók és deszerializálhatók, és exportálhatják a sémájukat. Az Adatszerződés sémaimportálása azonban nem tud új típusú adathalmaztípusokat létrehozni a sémából, mivel csak a meglévőket tudja újra felhasználni. A Svcutil.exe kapcsolóval /r
egy meglévő beírt adatkészletre mutathat. Ha gépelt adathalmazt használó szolgáltatás kapcsolója nélkül /r
próbál Svcutil.exe használni, a rendszer automatikusan kiválaszt egy másik szerializálót (XmlSerializer). Ha a DataContractSerializert kell használnia, és adathalmazokat kell létrehoznia a sémából, a következő eljárást használhatja: hozza létre a beírt adathalmaztípusokat (a Xsd.exe eszközzel a szolgáltatás kapcsolójával /d
), fordítsa le a típusokat, majd mutasson rájuk a /r
Svcutil.exe kapcsolóval.