SERIALIZACJA

Transkrypt

SERIALIZACJA
SERIALIZACJA
O CZYM POWIEMY?
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Czym jest serializacja?
Jak przeprowadzić proces serializacji?
Jak przeprowadzić proces deserializacji?
Serializacja własnych klas.
Dobre praktyki.
SoapFormatter.
Kiedy SoapFormater a kiedy BinaryFormatter?
Użycie SoapFormater.
Serializacja XML.
Własna implementacja serialiazacji.
Podsumowanie wad i zalet serializacji.
1. CZYM JEST SERIALIZACJA
Proces konwersji obiektu na strumień danych,
dzięki czemu możemy w łatwy sposób
przesłać stan obiektu przez sieć lub zapisać
na dysku.
Z pojęciem serializacji związane jest pojęcie
deserializacji – czyli procesu pozwalającego
na odtworzenie stanu obiektu z bajtów
zapisanych na dysku bądź przesłanych przez
internet.
2. JAK PRZEPROWADZIĆ PROCES SERIALIZACJI?
1.
2.
3.
Tworzymy strumień do zapisu
zserializowanego obiektu.
Tworzymy obiekt klasy BinaryFormatter
Wywołujemy metodę Serialize klasy
BinaryFormatter, której jako parametry
przekazujemy obiekt który chcemy
serializować oraz strumień do serializacji.
3. JAK PRZEPROWADZIĆ PROCES DESERIALIZACJI?
Tworzymy strumień do odczytu
zserializowanego obiektu
2. Tworzymy obiekt klasy BinaryFormatter
3. Tworzymy nowy obiekt do przechowania
odczytanych danych
4. Wywołujemy metodę Deserialize klasy
BinaryFormatter, której jako parametr
przekazujemy strumień do deserializacji.
Metoda Deserialize zwraca object, należy więc nie
zapomnieć o rzutowaniu.
1.
DEMO 1
4. SERIALIZACJA WŁASNYCH KLAS.
Aby napisana przez nas klasa mogła być serialozwana, należy
nadać jej atrybut Serializable:
[Serializable]
class MyClass
{
//...
}
Serializacji podlegają wszystkie pola (nawet te prywatne). Aby
wyodrębnić pola, które mają jej nie podlegać, należy przed polem
użyć atrybutu NonSerialized.
Dzięki atrybutowi OptionalField można zachować kompatybilność
pomiędzy wersjami. W przypadku gdy pole dodaliśmy, a w
poprzedniej wersji programu nie było go, po serializacji w polu
znajdzie się null (zapobiega wyrzuceniu wyjątku).
DOBRE PRAKTYKI






Nie usuwaj z klasy pola, które było serializowane
Nie dodawaj znacznika NonSerialized do pól, które w
poprzedniej wersji nie miały tego atrybutu.
Nie zmieniaj nazwy serializowanego pola
Kiedy dodajesz nowe pole do serializowanej klasy –
dodaj mu atrybut OptionalField
Kiedy usuwasz atrybut NonSerialized w klasie, która
była już serializowana, dodaj do tego pola atrybut
OptionalField
Dla opcjonalnych pól, w przypadku gdy chcesz aby
po deserializacji miały one inne wartości niż 0 i null
użyj metody
DEMO 2
6. SOAPFORMATTER
W przeciwieństiwe do BinaryFormatter, Soap
formater zapisuje dane do pliku w formacie
XML. Dzięki takiemu sposobowi zapewniamy
naszej aplikacji niezależność od używanego
systemu a także zapewniamy łatwą wymianę
danych poprzez internet (Webserwisy).
7. KIEDY SOAPFORMATER A KIEDY BINARYFORMATTER?
BinaryFormatter:
 Użytkownicy korzystają z oprogramowania
napisanego na platformę .NET
SoapFormatter
 Nasi klienci korzystają z różnych platform
 Dane przesyłamy poprzez internet
8. UŻYCIE SOAPFORMATER
1.
Dodajemy referencję do biblioteki:
System.Runtime.Serialization.Formatters.Soap.dll
Reszta kodu wygląda tak samo jak w
przypadku BinaryFormatter z tym że zamiast
klasy BinaryFormatter używamy
SoapFormatter.
Atrybuty, które możemy użyć na polach klasy:
SoapAttribute
SoapEnum
SoapDefaultValue
SoapIgnore
SoapElement
SoapType
2.
DEMO 3
9. SERIALIZACJA XML
Dlaczego serializować obiekty do XML:
 Niezależność i przenośność
 Łatwa edycja
 Lepsza kompatybilność
Ograniczenia serializacji XML:
 Serializować można tylko dane publiczne
 Nie można serializować obiektów złożonych z
innych obiektów (tzw. grafów obiektów)
 W klasie musi istnieć konstruktor domyślny
PRZEBIEG
1.
2.
Tworzymy strumień (TextWriter lub XmlWriter)
Tworzymy obiekt klasy XmlSerializer a w jego konstruktorze
podajemy typ serialozowanego obiektu.
Atrybuty które można przypisać publicznym polom serialozwanej
klasy:
XmlAnyAttribute
XmlElement
XmlAnyElement
XmlEnum
XmlArray
XmlIgnore
XmlArrayItem
XmlInclude
XmlAttribute
XmlRoot
XmlChoiceIdentifier
XmlText
XmlType
DEMO 4
10. WŁASNA IMPLEMENTACJA SERIALIZACJI
Własna implementacja serializacji zapewnia kompatybilność
z poprzednimi wersjami serializacji. (Dodanie, usunięcie
pól w klasach itp.).
Przebieg implementacji własnej serializacji:
 Implementujemy metodę GetObject interfejsu Iserializable
 Dodajemy do kolekcji SerializationInfo pary klucz i
wartość
 Tworzymy konstruktor do deserializacji:
protected Person(SerializationInfo info,
StreamingContext context)
 Następnie postępujemy jak przy serializacji binarnej.
ZDARZENIA SERIALIZACJI – TYLKO DLA
BINARYFORMATTER
DEMO 5
PODSUMOWANIE WAD I ZALET SERIALIZACJI.
Zalety:
 Łatwe przenoszenie informacji pomiędzy aplikacjami
 Możliwość ręcznej modyfikacji serializowanych plików
(XML)
 Najlepszy zamiennik w przypadku braku bazy danych.
Wady:
 Zużycie zasobów komputera
 Ryzyko utraty ważnych danych (XML)
 Problem z prywatnymi polami i klasami w serializacji XML
1. Which of the following are required to
serialize an object? (Choose all that
apply.)
A. An instance of BinaryFormatter or
SoapFormatter
B. File permissions to create temporary files
C. Microsoft Internet Information Services (IIS)
D. A stream object
2. Which of the following attributes should you
add to a class to enable it to be
serialized?
A. ISerializable
B. Serializable
C. SoapInclude
D. OnDeserialization
3. Which of the following attributes should you
add to a member to prevent it from
being serialized by BinaryFormatter?
A. NonSerialized
B. Serializable
C. SerializationException
D. SoapIgnore
4. Which of the following interfaces should you
implement to enable you to run a
method after an instance of your class is
deserialized?
A. IFormatter
B. ISerializable
C. IDeserializationCallback
D. IObjectReference
1. Which of the following are requirements for a
class to be serialized with XML
serialization? (Choose all that apply.)
A. The class must be public.
B. The class must be private.
C. The class must have a parameterless
constructor.
D. The class must have a constructor that accepts
a SerializationInfo parameter.
2. Which of the following attributes would you
use to cause a member to be serialized
as an XML attribute, rather than as an XML
element?
A. XmlAnyAttribute
B. XmlType
C. XmlElement
D. XmlAttribute
3. Which tool would you use to help you create
a class that, when serialized, would
produce an XML document that conformed to
an XML schema?
A. Xsd.exe
B. Xdcmake.exe
C. XPadsi90.exe
D. Xcacls.exe
4. Which of the following attributes should you
add to a member to prevent it from
being serialized by XML serialization?
A. XmlType
B. XmlIgnore
C. XmlElement
D. XmlAttribute