Megosztás a következőn keresztül:


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 nulllegyen) é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 DataContractSerializerXmlElement 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 ObjectIEnumerable) é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 XmlNodedeszerializá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 nullszá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 XmlNodedeklarált adattagok vagy az abból XmlNodeszá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 XmlNodeIEnumerable adattagjainak feltöltése nem eredményezi, hogy az adattagot példányként ArrayXmlNode kezelik. Minden tömbtag külön van szerializálva.

A tömbök használata esetén a DataContractSerializertö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 NetDataContractSerializerbá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 vissza null, és az IsAny attribútum tulajdonsága az alapértelmezett értéken falsemarad. Ez a típusok leggyakoribb használata IXmlSerializable .

  • 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ékre true , 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 a XmlSchemaProviderAttribute. 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 az XmlSchemaProviderAttribute attribútummal. Ehelyett a GetSchema sémagenerálás módszerére támaszkodnak. Ez a minta a DataSet 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 a XmlSchemaProviderAttribute típusokra IXmlSerializable .

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 IsAnytrue 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ön WriteXml .

  • Amikor rendszeresen szerializál egy elemtípust (például adatszerződés adattagjaként), a szerializáló a hívás WriteXmlelő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 írott WriteXml elem körül, kivéve, ha a szerializáló DataContractSerializer vagy NetDataContractSerializer 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 WriteXmlmeg . 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 nem NetDataContractSerializer 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, visszaadjatrue, IsStartObject ha bármilyen elem kezdetét megtalálja. ReadObject a verifyObjectName paraméter úgy van beállítva, hogy true ugyanúgy viselkedjen, mint IsStartObject az objektum tényleges olvasása előtt. ReadObject ezután átadja a vezérlést a metódusnak ReadXml .

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 XmlRootAttributeXmlSchemaProviderAttribute 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 XmlSerializeradatszerző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 a XmlSerializer.

  • Ha az XmlRootAttribute attribútum nem található tartalom- vagy örökölt adathalmaz-típusok esetében, az XmlSerializer ü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 a XmlSerializersé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 XmlElementtö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 ArrayXmlNode . 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 WriteXmlkerü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álni WriteRaw , hogy az eredmény bármilyen kódolásban használható legyen.

  • Implementáláskor WriteXmlkerü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 helyett DataSet .

  • Importáláskor DataSet vagy DataTable 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.

Lásd még