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


Az XmlSerializer osztály használata

A Windows Communication Foundation (WCF) két különböző szerializálási technológiát használhat az alkalmazás adatainak xml-fájltá alakításához, amely az ügyfelek és szolgáltatások között továbbítva van: DataContractSerializer és XmlSerializer.

DataContractSerializer

A WCF alapértelmezés szerint az DataContractSerializer osztály használatával szerializálja az adattípusokat. Ez a szerializáló a következő típusokat támogatja:

  • Primitív típusok (például egész számok, sztringek és bájttömbök), valamint néhány speciális típus, például XmlElement és DateTime, amelyek primitívként vannak kezelve.

  • Adatszerződés-típusok (az DataContractAttribute attribútummal megjelölt típusok).

  • Az attribútummal SerializableAttribute jelölt típusok, amelyek tartalmazzák az interfészt ISerializable megvalósító típusokat.

  • Az interfészt IXmlSerializable megvalósító típusok.

  • Számos gyakori gyűjteménytípus, amelyek számos általános gyűjteménytípust tartalmaznak.

Számos .NET-keretrendszer típus az utóbbi két kategóriába tartozik, és így szerializálható. A szerializálható típusok tömbjei is szerializálhatók. A teljes listát a Szolgáltatásszerződések adatátvitelének megadása című témakörben találja.

Az DataContractSerializerúj WCF-szolgáltatások írásának ajánlott módja az adatszerződés-típusok együttes használata. További információ: Adatszerződések használata.

XmlSerializer

A WCF az osztályt XmlSerializer is támogatja. Az XmlSerializer osztály nem egyedi a WCF-ben. Ez ugyanaz a szerializálási motor, amelyet ASP.NET webszolgáltatások használnak. Az XmlSerializer osztály sokkal szűkebb típuskészletet támogat, mint az DataContractSerializer osztály, de sokkal nagyobb ellenőrzést tesz lehetővé az eredményül kapott XML felett, és sokkal több XML-sémadefiníciós nyelvet (XSD) támogat. Emellett nem igényel deklaratív attribútumokat a szerializálható típusok esetében. További információkért tekintse meg az XML-szerializálás témakörét a .NET-keretrendszer dokumentációjában. Az XmlSerializer osztály nem támogatja az adatszerződések típusait.

Ha Svcutil.exe vagy a Visual Studióban a Szolgáltatás hozzáadása referenciája funkcióval hoz létre ügyfélkódot egy harmadik féltől származó szolgáltatáshoz, vagy egy harmadik féltől származó sémához szeretne hozzáférni, a rendszer automatikusan kiválaszt egy megfelelő szerializálót. Ha a séma nem kompatibilis a DataContractSerializerkövetkezővel, a rendszer kijelöli a sémát XmlSerializer .

Váltás az XmlSerializerre

Előfordulhat, hogy időnként manuálisan kell váltania a XmlSerializer. Ez történik például a következő esetekben:

  • Amikor ASP.NET webszolgáltatásokból WCF-re migrál egy alkalmazást, előfordulhat, hogy új adatszerződés-típusok létrehozása helyett újra szeretné használni a meglévő, XmlSerializer-kompatibilis típusokat.

  • Ha fontos az üzenetekben megjelenő XML pontos szabályozása, de a Web Services Description Language (WSDL) dokumentuma nem érhető el, például olyan szolgáltatás létrehozásakor, amelynek meg kell felelnie egy bizonyos szabványosított, közzétett sémának, amely nem kompatibilis a DataContractSerializerrel.

  • Az örökölt SOAP-kódolási szabványt követő szolgáltatások létrehozásakor.

Ezekben és más esetekben manuálisan válthat az osztályra az XmlSerializerXmlSerializerFormatAttribute attribútum szolgáltatásra való alkalmazásával, ahogyan az az alábbi kódban is látható.

[ServiceContract]
[XmlSerializerFormat]
public class BankingService
{
[OperationContract]
    public void ProcessTransaction(BankingTransaction bt)
    {
        // Code not shown.
    }
}

//BankingTransaction is not a data contract class,
//but is an XmlSerializer-compatible class instead.
public class BankingTransaction
{
    [XmlAttribute]
    public string Operation;
    [XmlElement]
    public Account fromAccount;
    [XmlElement]
    public Account toAccount;
    [XmlElement]
    public int amount;
}
//Notice that the Account class must also be XmlSerializer-compatible.
<ServiceContract(), XmlSerializerFormat()> _
Public Class BankingService
    <OperationContract()> _
    Public Sub ProcessTransaction(ByVal bt As BankingTransaction)
        ' Code not shown.
    End Sub
End Class


' BankingTransaction is not a data contract class,
' but is an XmlSerializer-compatible class instead.

Public Class BankingTransaction
    <XmlAttribute()> _
    Public Operation As String
    <XmlElement()> _
    Public fromAccount As Account
    <XmlElement()> _
    Public toAccount As Account
    <XmlElement()> _
    Public amount As Integer
End Class
'Notice that the Account class must also be XmlSerializer-compatible.

Biztonsági szempontok

Feljegyzés

A szerializációs motorok váltásakor fontos óvatosnak lenni. Ugyanez a típus a használt szerializálótól függően eltérően szerializálható XML-fájlba. Ha véletlenül nem a megfelelő szerializálót használja, előfordulhat, hogy olyan típusú adatokat tesz közzé, amelyet nem kívánt közzétenni.

Az osztály például csak az DataContractSerializer adatszerződés-típusok szerializálásakor szerializálja az DataMemberAttribute attribútummal megjelölt tagokat. Az XmlSerializer osztály minden nyilvános tagot szerializál. Tekintse meg a típust az alábbi kódban.

[DataContract]
public class Customer
{
    [DataMember]
    public string firstName;
    [DataMember]
    public string lastName;
    public string creditCardNumber;
}
<DataContract()> _
Public Class Customer
    <DataMember()> _
    Public firstName As String
    <DataMember()> _
    Public lastName As String
    Public creditCardNumber As String
End Class

Ha a típust véletlenül használják olyan szolgáltatási szerződésben, amelyben az XmlSerializer osztály van kiválasztva, a creditCardNumber tag szerializálva van, ami valószínűleg nem rendeltetése.

Annak ellenére, hogy az DataContractSerializer osztály az alapértelmezett, explicit módon kiválaszthatja a szolgáltatáshoz (bár erre soha nem lesz szükség), ha alkalmazza az DataContractFormatAttribute attribútumot a szolgáltatási szerződés típusára.

A szolgáltatáshoz használt szerializáló a szerződés szerves része, és nem módosítható egy másik kötés kiválasztásával vagy más konfigurációs beállítások módosításával.

Az osztályra XmlSerializer egyéb fontos biztonsági szempontok vonatkoznak. Először is erősen ajánlott, hogy az osztályt használó XmlSerializer WCF-alkalmazások aláírása olyan kulccsal legyen aláírva, amely védve van a közzétételtől. Ez a javaslat mind a manuális váltáskor, mind az XmlSerializer automatikus kapcsoló végrehajtásakor (Svcutil.exe, szolgáltatáshivatkozás hozzáadása vagy egy hasonló eszköz által) érvényes. Ennek az az oka, hogy a XmlSerializer szerializálási motor támogatja az előre létrehozott szerializációs szerelvények betöltését, amennyiben azokat ugyanazzal a kulccsal írták alá, mint az alkalmazás. Az aláíratlan alkalmazások teljesen védtelenek az alkalmazásmappába vagy a globális szerelvény-gyorsítótárba helyezett előre létrehozott szerializálási szerelvény várt nevével egyező rosszindulatú szerelvény lehetőségével. Természetesen a támadónak először írási hozzáférést kell szereznie e két hely egyikéhez a művelet megkísérléséhez.

Egy másik fenyegetés, amely akkor áll fenn, amikor használja XmlSerializer , a rendszer ideiglenes mappájának írási hozzáférésével kapcsolatos. A XmlSerializer szerializálási motor ideiglenes szerializálási szerelvényeket hoz létre és használ ebben a mappában. Vegye figyelembe, hogy az ideiglenes mappához írási hozzáféréssel rendelkező folyamatok rosszindulatú kóddal felülírhatják ezeket a szerializálási szerelvényeket.

Az XmlSerializer támogatásának szabályai

Nem alkalmazhat XmlSerializerközvetlenül -kompatibilis attribútumokat a szerződés műveleti paramétereire, és nem adhat vissza értékeket. Ezek azonban alkalmazhatók a beírt üzenetekre (üzenetszerződés törzsrészekre), ahogy az az alábbi kódban is látható.

[ServiceContract]
[XmlSerializerFormat]
public class BankingService
{
    [OperationContract]
    public void ProcessTransaction(BankingTransaction bt)
    {
        //Code not shown.
    }
}

[MessageContract]
public class BankingTransaction
{
    [MessageHeader]
    public string Operation;
    [XmlElement, MessageBodyMember]
    public Account fromAccount;
    [XmlElement, MessageBodyMember]
    public Account toAccount;
    [XmlAttribute, MessageBodyMember]
    public int amount;
}
<ServiceContract(), XmlSerializerFormat()> _
Public Class BankingService
    <OperationContract()> _
    Public Sub ProcessTransaction(ByVal bt As BankingTransaction)
        'Code not shown.
    End Sub
End Class

<MessageContract()> _
Public Class BankingTransaction
    <MessageHeader()> _
    Public Operation As String
    <XmlElement(), MessageBodyMember()> _
    Public fromAccount As Account
    <XmlElement(), MessageBodyMember()> _
    Public toAccount As Account
    <XmlAttribute(), MessageBodyMember()> _
    Public amount As Integer
End Class

A beírt üzenettagokra alkalmazva ezek az attribútumok felülbírálják a beírt üzenetattribútumokon ütköző tulajdonságokat. Az alábbi kódban ElementName például felülbírálások Name.

    [MessageContract]
    public class BankingTransaction
    {
        [MessageHeader] public string Operation;

        //This element will be <fromAcct> and not <from>:
        [XmlElement(ElementName="fromAcct"), MessageBodyMember(Name="from")]
        public Account fromAccount;

        [XmlElement, MessageBodyMember]
        public Account toAccount;

        [XmlAttribute, MessageBodyMember]
        public int amount;
}
<MessageContract()> _
Public Class BankingTransaction
    <MessageHeader()> _
    Public Operation As String

    'This element will be <fromAcct> and not <from>:
    <XmlElement(ElementName:="fromAcct"), _
        MessageBodyMember(Name:="from")> _
    Public fromAccount As Account

    <XmlElement(), MessageBodyMember()> _
    Public toAccount As Account

    <XmlAttribute(), MessageBodyMember()> _
    Public amount As Integer
End Class

Az MessageHeaderArrayAttribute attribútum nem támogatott a XmlSerializer.

Feljegyzés

Ebben az esetben a XmlSerializer WCF előtt kiadott alábbi kivételt adja ki: "A séma legfelső szintjén deklarált elem nem lehet maxOccurs> 1. Adjon meg egy burkolóelemet az "egyebek" számára a Burkolt paraméterstílus használatával XmlArray vagy XmlArrayItem helyett XmlElementAttribute, vagy a Burkolt paraméterstílus használatával."

Ha ilyen kivételt kap, vizsgálja meg, hogy ez a helyzet érvényes-e.

A WCF nem támogatja az üzenetszerződésekben és XmlIncludeAttribute a SoapIncludeAttribute műveleti szerződésekben szereplő attribútumokat, helyette használja az KnownTypeAttribute attribútumot.

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.

Figyelmeztetés

Ha polimorf típusokat szerializál, a típusra kell alkalmaznia, XmlSchemaProviderAttribute hogy a megfelelő típus szerializálva legyen.

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 be az IsAny attribútum tulajdonságát a XmlSchemaProviderAttribute sémaszolgáltató metódusára true , vagy térjen vissza null . A sémaszolgáltatói metódus használata nem kötelező elemtípusok esetén – a metódus neve helyett megadható null a XmlSchemaProviderAttribute. Ha azonban van, IsAnytrue és meg van adva sémaszolgáltatói metódus, a metódusnak vissza kell adnia null.

  • 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 az attribútumok burkolóelemhez való hozzáadását is. 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ó elhelyezi az XML-olvasót az adattag burkolóelemén, és átadja a vezérlést 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

Séma és 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 határoznia, 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 globális elemdeklaráció a következő használatával lesz exportálva: ElementName, Namespace és IsNullable tulajdonságok. Az alkalmazott alapértelmezett értékek XmlRootAttribute az adatszerződés neve, az üres névtér és a "nillable" érték true.

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 a felső szinten szerializál egy elemtípust, a szerializáló általában nem ad ki burkoló elemet az írott WriteXml elem körül, kivéve, ha a szerializáló vagy NetDataContractSerializer konstruktorokban való létrehozásakor explicit módon meg van adva a gyökérnév és a DataContractSerializer 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 meg kéne adnia a gyökérnevet és a névteret az építéskor, WriteStartObject és WriteEndObject lényegében semmit sem tesz, és WriteObjectContent nem hív meg WriteXml. Ebben a módban a szerializált objektum nem lehet null és nem rendelhető 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 a következő listában foglaljuk össze:

  • A sémaszolgáltatói metódusnak nyilvánosnak kell lennie ahhoz, hogy az XmlSerializeradatszerződés-modellben használhassa, de nem kell nyilvánosnak lennie.

  • A sémaszolgáltató metódust akkor hívjuk meg, ha IsAny az adatszerződés-modellben van, true de nem 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.

Az XmlSerializer örökölt viselkedése

A .NET-keretrendszer 4.0-s és korábbi verzióiban az XmlSerializer ideiglenes szerializálási szerelvényeket hozott létre C#-kód fájlba írásával. A fájlt ezután egy szerelvénybe állították össze. Ennek a viselkedésnek néhány nemkívánatos következménye volt, például a szerializáló indítási idejének lassítása. A 4.5 .NET-keretrendszer ezt a viselkedést úgy módosították, hogy a fordító használata nélkül generálja a szerelvényeket. Előfordulhat, hogy egyes fejlesztők látni szeretnék a létrehozott C# kódot. Ezt az örökölt viselkedést a következő konfigurációval adhatja meg:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.xml.serialization>
    <xmlSerializer tempFilesLocation='e:\temp\XmlSerializerBug' useLegacySerializerGeneration="true" />
  </system.xml.serialization>
  <system.diagnostics>
    <switches>
      <add name="XmlSerialization.Compilation" value="1" />
    </switches>
  </system.diagnostics>
</configuration>

Ha kompatibilitási problémákba ütközik, például nem XmlSerializer nyilvános új felülbírálással szerializál egy származtatott osztályt, a következő konfigurációval válthat vissza az XMLSerializer örökölt viselkedésre:

<configuration>
  <appSettings>
    <add key="System:Xml:Serialization:UseLegacySerializerGeneration" value="true" />
  </appSettings>
</configuration>

A fenti konfiguráció alternatívaként a következő konfigurációt használhatja a .NET-keretrendszer 4.5-ös vagy újabb verziót futtató gépeken:

<configuration>
  <system.xml.serialization>
    <xmlSerializer useLegacySerializerGeneration="true"/>
  </system.xml.serialization>
</configuration>

Feljegyzés

A <xmlSerializer useLegacySerializerGeneration="true"/> kapcsoló csak a .NET-keretrendszer 4.5-ös vagy újabb verziót futtató gépeken működik. A fenti appSettings megközelítés minden .NET-keretrendszer verzión működik.

Lásd még