„Szoftverfejlesztés .NET platformon - Jegyzet 5. fejezet” változatai közötti eltérés
a David14 átnevezte a(z) Serialization lapot a következő névre: Szoftverfejlesztés .NET plattformon - Jegyzet 5. fejezet |
a Hryghr átnevezte a(z) Szoftverfejlesztés .NET plattformon - Jegyzet 5. fejezet lapot a következő névre: Szoftverfejlesztés .NET platformon - Jegyzet 5. fejezet: pontos név |
(Nincs különbség)
|
A lap jelenlegi, 2013. május 19., 22:27-kori változata
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
70-536 .NET framework 2.0 Application Development Foundation
%TOC{depth="3"}%
Bináris sorosítás
=System.Runtime.Serialization.Formatters.Binary.BinaryFormatter=: gyors, kicsi kimenetet ad, nem cross-platform. A privát változókat is sorosítja. A sorosítandó osztályokat =[Serializable]= attribútummal kell ellátni.
Használható attribútumok:
- =[NonSerialized]=: a változót nem kell sorosítani
Sorosítás lépései (általános sorosítás esetén is igaz)
- Stream nyitása
- Formatter létrehozása
- sorosítás
string data = "This must be stored in a file."; FileStream fs = new FileStream("SerializedString.Data", FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, data); fs.Close(); FileStream fs = new FileStream("SerializedString.Data", FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); string data = (string) bf.Deserialize(fs); fs.Close(); Console.WriteLine(data);
SOAP sorosítás
=System.Runtime.Serialization.Formatters.Soap.SoapFormatter=: kicsit lassabb, sokkal nagyobb kimenet. Cross-platform, de a .NET 1.1 és a 2.0 között csak részben kompatibilis. Referenciát kell hozzáadni a projekthez.
Használható attribútumok:
- =[SoapIgnore]=: ne sorosítsa a mezőt
- =[SoapElement]=, =[SoapAttribute]=: XML attribútumként vagy elementként sorosítson
- =[SoapEnum]=: felsoroláshoz tartozó tag név
XML sorosítás
=System.Xml.Serialization.XmlSerializer=: egyedi XML file-ba lehet vele sorosítani. Csak default konstruktorral rendelkező publikus osztályokra működik, és csak a publikus adattagokat sorosítja. Nem szükséges =[Serializable]= attribútum. A sorosított objektumnak körmentesnek kell lennie.
Előnyei:
- Interoperabilitás: legtöbb nyelvvel könnyű értelmezni a kapott XML-t
- Könnyű adminisztráció: szöveges formátumú, ezért bármivel szerkeszthető
- Egy osztály különböző verziói könnyen kompatibilissá tehetők sorosítás szempontjából
Használható attribútumok:
- =[XmlIgnore]=, =[XmlElement]=, =[XmlAttribute]=, =[XmlEnum]=: mint a SOAP-nál
- =[XmlText]=: XML szövegként sorosítsa a mezőt
- =[XmlArray]=, =[XmlArrayItem]=: kollekcióhoz és elemeihez tartozó tag neve
- =[XmlAnyAttribute]=, =[XmlAnyElement]=: a sorosítás során nem felismert attribútumokat és elementeket ezekbe a tömbökbe gyűjti
- =[XmlRoot]=: XML gyökér elementjének neve
- =[XmlType]=: XML névtere
XML Schema-ból lehet osztály vázakat generálni az xsd.exe-vel.
Egyedi sorosítás
- Az osztályt el kell látni =[Serializable]= attribútummal.
- Implementálni kell az =ISerializable= interfész
=GetObjectData(SerializationInfo info, StreamingContext context)= metódusát. A =SerializationInfo= név-érték párokat tartalmaz.
- Ugyanezen paraméterekkel írni kell egy konstruktort (ajánlott láthatósági szint: protected).
- olvasás: =info.GetInt32(kulcs)=, stb.
- írás: =info.AddValue(kulcs, érték)=
- deszerializáció helye: =StreamingContext.State=.
Értékei: =CrossProcess=, =CrossMachine=, =File=, =Persistence=, ...
- Hibás bemenet esetén
SerializationException
-t kell dobni.
Sorosított adatok egyedi formázása
- =IFormatter= vagy =IGenericFormatter= interfészt kell implementálni.
- Az implementációt egyszerűsíti, ha felhasználjuk a =FormatterServices= osztály metódusait.
Sorosítási események
Sorrendben:
- =[Serializing]=: sorosítás előtt
- =[Serialized]=: sorosítás után
- =[Deserializing]=: visszaállítás előtt
- =[Deserialized]=: visszaállítás után
- Mindegyiket =void (StreamingContext)= típusú metódus elé kell írni
- =IDeserializationCallback.OnDeserialization=: legvégén, itt kell visszaállítani a számolt értékeket.
- A könyvben az ábrán rosszul szerepel, a .NET Reflectorral lehet ellenőrizni a sorrendet.
- =void IDeserializationCallback.OnDeserialization(Object sender) { ... }=
-- Peti - 2007.06.27.