Hoodsstuk 5 - Les 1

Serealisatie, zoals geimplementeerd in de System.Runtime.Serialization namespace, is het process van serialiseren en deserialiseren van objecten zodat deze kunnen worden opgeslagen of vervoerd en later opnieuw aangemaakt kunnen worden. Serialiseren is het converteren van een object in een lineaire volgorde van bytes die kunnen worden opgeslagen of worden vervoerd.

Globaar gezien werkt het serialisatie process als volgt:

  1. Maak een stream object die de serialisatie output bevat
  2. Maak een BinaryFormatter object (te vinden in System.Runtime.Serialization.Formatters.Binary)
  3. Roep de BinaryFormatter.Serialize() methode aan om het object te serialiseren en de output op te slaan in de stream

string data = "Dit moet worden opgeslagen in een bestand";

// Maak een bestand aan om de data op te slaan
FileStream fs = new FileStream("Serialize.data", FileMode.Create);

// Maak een binary formatter object
BinaryFormatter bf = new BinaryFormatter();

// Serialiseer de data m.b.v. de binary formatter
bf.Serialize(fs, data);

// Sluit het bestand
fs.Close();



Het deserialiseren werkt als volgt:

  1. Maak een stream object om de geserialiseerde output te lezen
  2. Maak en Binary Formatter object
  3. Maak een nieuw object om de gedeserialiseerde data op te slaan
  4. Roep de BinaryFormatter.Deserialize methode aan om het object te deserialiseren en te casten naar het juiste type.

// Open bestand waarvan de data  moet worden gelezen
FileStream fs = new FileStream("Serialize.data", FileMode.Open);

// Maak een binary formatter object
BinaryFormatter bf = new BinaryFormatter();

// Maak een object om de data in op te slaan
string data = "";

// Deserialiseer de data m.b.v. de binary formatter
data = (string)bf.Deserialize(fs);

// Sluit het bestand
fs.Close();

// Toon gedeserialiseerde output
Console.WriteLine(data);

Zelf gemaakte classes zijn standaard niet te serialseren. Dit kan wel mogelijk gemaakt worden door het [Serializable] attribuut aan de klasse mee te geven.Bij het serialiseren worden ook de private attributen meegenomen.

Het is mogelijk om te bepalen hoe serialisatie plaatsvindt. Dit kan gedaan worden voor efficientie of om aan bepaalde wensen te voldoen.

Het kan voorkomen dat bepaalde elementen niet geserialiseerd hoeven te worden. Denk hierbij bijvoorbeeld aan totalen of andere waarden die berekent kunnen worden op basis van de velden die de klasse bevat. Om bepaalde velden niet mee te nemen in de serialisatie kan de attribuut [NonSerialized] worden toegevoegd aan het veld.

Om een niet-geserialiseerd veld automatisch te initialiseren, wordt de IDeserializationCallback interface gebruikt. Hiervoor moet de methode IDeserializationCallback.OnDeserialization geimplementeerd worden. Bij elke deserialisatie wordt deze methode aangeroepen.



[Serializable]
class Foo : IDeserializationCallback
{
int amount;
int price;
[Nonserialized]
int total;

public Foo(int amount, int price)
{ this.Amount = amount; this.price = price; }

void IDeserializationCallback.OnDeserialization(object sender)
{ this.total = this.price * this.amount; }
}



Om met verschillende versies om te gaan van geserialiseerde objecten kan gebruik gemaakt worden van de attribuut [OptionalField]. Zo ontstaat er geen exception als een ouder object dat dit veld niet heeft wordt gedeserialiseerd.

.NET bevat 2 classes voor het formatten van geserialiseerde data, beide implementeren de IRemotingFormatter interface.
  1. BinaryFormatter: is het meest efficientst als objecten enkel gelezen worden door .NET gebaseerde applicaties.
  2. SoapFormatter: is het meest efficienst als objecten over een netwerk worden gestuurd of er non- .NET applicaties mee moeten werken.

Om de SoapFormatter te gebruiken moet apart de assembly worden ingeladen: System.Runtime.Serialization.Formatters.Soap.dll. De SoapFormatter kan exact hetzelfde gebruikt worden als de BinaryFormatter.

Het is mogelijk om de format te bepalen voor een SOAP object door middel van attributen:

SoapAttribute: het veld wordt geserialiseerd als een xml attribuut
SoapDefaultValue: de standaard waarde van een xml attribuut
SoapElement: de cass wordt geserialiseerd als een xml element
SoapEnum: de naam ven een enum attribuut
SoapIgnore: De property ofn veld wordt genegeerd bij het serialiseren
SoapType: Het xml schema dat wordt gegenereerd als een class wordt geserialiseerd

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren