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é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 be az IsAny attribútum tulajdonságát a XmlSchemaProviderAttribute sémaszolgáltató metódusáratrue
, vagy térjen visszanull
. A sémaszolgáltatói metódus használata nem kötelező elemtípusok esetén – a metódus neve helyett megadhatónull
aXmlSchemaProviderAttribute
. Ha azonban van,IsAny
true
és meg van adva sémaszolgáltatói metódus, a metódusnak vissza kell adnianull
.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 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 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 a felső szinten szerializál egy elemtípust, a szerializáló általában nem ad ki burkoló elemet az írottWriteXml
elem körül, kivéve, ha a szerializáló vagyNetDataContractSerializer
konstruktorokban való létrehozásakor explicit módon meg van adva a gyökérnév és aDataContractSerializer
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 lehetnull
és nem rendelhető 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 a következő listában foglaljuk össze:
A sémaszolgáltatói metódusnak nyilvánosnak kell lennie ahhoz, hogy az
XmlSerializer
adatszerző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 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.
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.