Szoftverfejlesztés .NET platformon - Jegyzet 5. fejezet

A VIK Wikiből
A lap korábbi változatát látod, amilyen Hryghr (vitalap | szerkesztései) 2013. május 19., 21:27-kor történt szerkesztése után volt. (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)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Ez az oldal a korábbi SCH wiki-ről lett áthozva. Az eredeti változata itt érhető el.

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)

  1. Stream nyitása
  2. Formatter létrehozása
  3. 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.