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


Szerializációs

Feljegyzés

Ezt a tartalmat a Pearson Education, Inc. engedélyével nyomtatjuk újra a Framework Design Guidelines: Conventions, Idioms és Patterns for Reusable .NET Libraries, 2nd Edition engedélyével. Ezt a kiadást 2008-ban adták ki, és a könyvet azóta teljesen átdolgozták a harmadik kiadásban. Előfordulhat, hogy az oldalon található információk némelyike elavult.

A szerializálás az objektumok könnyen megőrizhető vagy átküldhető formátummá alakításának folyamata. Például szerializálhat egy objektumot, átköltheti az interneten HTTP használatával, és deszerializálhatja azt a célgépen.

A .NET-keretrendszer három fő szerializálási technológiát kínál különböző szerializálási forgatókönyvekhez optimalizálva. Az alábbi táblázat ezeket a technológiákat és az ezekhez a technológiákhoz kapcsolódó fő keretrendszertípusokat sorolja fel.

Technológia neve Fő típusok Forgatókönyvek
Adatszerződés szerializálása DataContractAttribute
DataMemberAttribute
DataContractSerializer
NetDataContractSerializer
DataContractJsonSerializer
ISerializable
Általános adatmegőrzés
Webszolgáltatások
JSON
XML-szerializálás XmlSerializer XML-formátum az XML alakzatának teljes vezérlésével
Futtatókörnyezeti szerializálás (bináris és SOAP) SerializableAttribute
ISerializable
BinaryFormatter
SoapFormatter
.NET-újraküldés

✔️ Ne gondoljon a szerializálásra az új típusok tervezésekor.

A megfelelő szerializálási technológia kiválasztása a támogatáshoz

✔️ FONTOLJA meg az adatszerződés szerializálásának támogatását, ha előfordulhat, hogy a típuspéldányokat meg kell őrizni vagy használni kell a Web Servicesben.

✔️ Fontolja meg, hogy támogatja az XML-szerializálást az adatszerződés szerializálása helyett vagy mellett, ha a típus szerializálásakor létrehozott XML-formátumot jobban szabályozni kell.

Erre szükség lehet bizonyos együttműködési helyzetekben, amikor olyan XML-szerkezetet kell használnia, amelyet nem támogat az adatszerződés szerializálása, például XML-attribútumok létrehozásához.

✔️ FONTOLJA meg a futtatókörnyezeti szerializálás támogatását, ha a típuspéldányoknak át kell haladnia a .NET-remoting határain.

❌ NE támogassa a futtatókörnyezeti szerializálást vagy az XML-szerializálást csak általános megőrzési okokból. Inkább az adatszerződés szerializálását részesítse előnyben.

Adatszerződések szerializálásának támogatása

A típusok támogathatják az DataContractAttribute adatszerződések szerializálását a típusra és a DataMemberAttribute típus tagjaira (mezőkre és tulajdonságokra) való alkalmazásával.

✔️ FONTOLJA meg a nyilvános típus adattagjainak megjelölését, ha a típus részleges megbízhatósági kapcsolaton használható.

Teljes megbízhatósággal az Adatszerződés szerializálói szerializálhatják és deszerializálhatják a nem nyilvános típusokat és tagokat, de csak a nyilvános tagok szerializálhatók és deszerializálhatók részleges megbízhatósági kapcsolat esetén.

✔️ DO implementálja a getter és a setter minden tulajdonságot, amely rendelkezik DataMemberAttribute. Az adatszerződés szerializálóinak a típus lekérését és a beállítót is szerializálhatónak kell tekinteni. (A 3.5 SP1 .NET-keretrendszer egyes gyűjteménytulajdonságok csak lekérésesen használhatók.) Ha a típus nem használható részleges megbízhatósági kapcsolat esetén, a tulajdonság egyik vagy mindkét tartozéka lehet nem nyilvános.

✔️ FONTOLJA meg a szerializált példányok inicializálásához használt szerializálási visszahívásokat.

A konstruktorok nem lesznek meghívva, ha az objektumok deszerializálva vannak. (Vannak kivételek a szabály alól. A deszerializálás során meghívjuk a megjelölt CollectionDataContractAttribute gyűjtemények konstruktorait.) Ezért a normál konstrukció során végrehajtott logikát a szerializálási visszahívások egyikeként kell megvalósítani.

OnDeserializedAttribute a leggyakrabban használt visszahívási attribútum. A család többi attribútuma az OnDeserializingAttribute, OnSerializingAttributeés OnSerializedAttribute. Ezek a visszahívások jelölésére használhatók, amelyek a deszerializálás előtt, a szerializálás előtt, végül pedig a szerializálás után lesznek végrehajtva.

✔️ VEGYE FIGYELEMBE, hogy az KnownTypeAttribute összetett objektumdiagramok deszerializálása során használandó konkrét típusokat jelöli.

✔️ A szerializálható típusok létrehozásakor vagy módosításakor fontolja meg a visszamenőleges és az előre kompatibilitást.

Ne feledje, hogy a típus jövőbeli verzióinak szerializált streamjei deszerializálhatók a típus aktuális verziójába, és fordítva.

Győződjön meg arról, hogy az adattagok , akár privátak, akár belsők, nem módosíthatják a nevüket, a típusukat vagy akár a sorrendjüket a típus későbbi verzióiban, kivéve, ha különös figyelmet fordítunk arra, hogy a szerződést explicit paraméterekkel őrizzük meg az adatszerződés attribútumaihoz.

Szerializálás kompatibilitásának tesztelése szerializálható típusok módosításakor. Próbálja meg deszerializálni az új verziót egy régi verzióra, és fordítva.

✔️ FONTOLJA meg a implementálást IExtensibleDataObject , hogy lehetővé tegye a ciklikus becsúszást a típus különböző verziói között.

A felület lehetővé teszi a szerializáló számára, hogy a ciklikus bemásolás során ne vesszenek el adatok. A IExtensibleDataObject.ExtensionData tulajdonság az aktuális verzió által ismeretlen típus jövőbeli verziójából származó adatok tárolására szolgál, ezért nem tudja tárolni azokat az adattagokban. Ha az aktuális verziót később szerializálják és deszerializálják egy későbbi verzióra, a további adatok a szerializált streamben lesznek elérhetők.

XML-szerializálás támogatása

Az adatszerződés szerializálása a fő (alapértelmezett) szerializálási technológia a .NET-keretrendszer, de vannak olyan szerializálási forgatókönyvek, amelyeket az adatszerződés szerializálása nem támogat. Ez például nem biztosít teljes körű ellenőrzést a szerializáló által előállított vagy felhasznált XML-formátum felett. Ha ilyen finom vezérlésre van szükség, XML-szerializálást kell használni, és a szerializálási technológia támogatásához meg kell terveznie a típusokat.

❌ NE tervezzen kifejezetten XML-szerializálási típusokat, kivéve, ha nagyon erős oka van a létrehozott XML alakjának szabályozására. Ezt a szerializálási technológiát felülírta az előző szakaszban tárgyalt adatszerződés szerializálása.

✔️ Fontolja meg az IXmlSerializable interfész implementálását, ha még jobban szeretné szabályozni a szerializált XML alakját, mint amit az XML szerializálási attribútumok alkalmazásával kínálunk. Az interfész két módszere, ReadXml és WriteXmllehetővé teszi a szerializált XML-adatfolyam teljes vezérlését. A típushoz létrehozott XML-sémát is szabályozhatja a XmlSchemaProviderAttribute.

Futtatókörnyezeti szerializálás támogatása

A futtatókörnyezet szerializálása a .NET-remoting által használt technológia. Ha úgy gondolja, hogy a típusok .NET-remoting használatával lesznek szállítva, győződjön meg arról, hogy támogatják a futtatókörnyezeti szerializálást.

A futtatókörnyezet szerializálásának alapvető támogatása a SerializableAttribute, és a fejlettebb forgatókönyvek egy egyszerű futtatókörnyezeti szerializálható minta implementálásával (szerializálási konstruktor implementálásával ISerializable és biztosításával) biztosítható.

✔️ FONTOLJA meg a futtatókörnyezeti szerializálás támogatását, ha a típusok .NET-újraküldéssel lesznek használva. A névtér például System.AddIn .NET-újraküldést használ, ezért a bővítmények között System.AddIn kicserélt összes típusnak támogatnia kell a futtatókörnyezeti szerializálást.

✔️ Fontolja meg a futtatókörnyezet szerializálható mintájának implementálását, ha teljes körű ellenőrzést szeretne végezni a szerializálási folyamat felett. Ha például az adatokat szerializálva vagy deszerializálva szeretné átalakítani.

A minta nagyon egyszerű. Mindössze annyit kell tennie, hogy implementálja az ISerializable interfészt, és egy speciális konstruktort biztosít, amelyet az objektum deszerializálásakor használnak.

✔️ TEGYE védetté a szerializálási konstruktort, és adjon meg két paramétert, amelyek pontosan az itt látható mintában láthatóak szerint lesznek begépelve és elnevezve.

[Serializable]
public class Person : ISerializable
{
    protected Person(SerializationInfo info, StreamingContext context)
    {
        // ...
    }
}

✔️ A DO explicit módon implementálja a ISerializable tagokat.

✔️ DO alkalmazza a hivatkozásigényt a megvalósításra ISerializable.GetObjectData . Ez biztosítja, hogy csak a teljes mértékben megbízható mag és a futtatókörnyezeti szerializáló férhessen hozzá a taghoz.

© Részletek 2005, 2009 Microsoft Corporation. Minden jog fenntartva.

Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published 22, 2008 by Addison-Wesley Professional, a Microsoft Windows Development Series részeként.

Lásd még