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