Hoofdstuk 5 - Les 2

System.Xml.Serialization bevat methoden voor het converteren van objecten, van en naar xml bestanden.

Gebruik XML serialisatie als objecten moeten worden uitgewisseld met applicaties die het .NET framework niet ondersteunen. XML Serialisatie bevat de volgende voordelen ten opzichte van normale serialisatie.

  • Grotere samenwerking: XML is een text bestand en dus kan er door elke taal mee worden gewerkt.
  • Meer administrator vriendelijk: Geserialiseerde xml bestanden kunnen gelezen worden door administrators. Daarbij kunnen deze bestanden aangepast worden.
  • Betere forward-compatability: Als een nieuwe versie van een applicatie uitkomt kunnen de XML bestanden makkelijker worden verwerkt.

Nadelen van XML serialisatie:

  • XML serialisatie kan geen private velden bevatten, enkel public velden.
  • Er kunnen geen object graphs geserialiseerd worden, alleen objecten.

Globaal ziet XML serialisatie er als volgt uit:

  1. Maak een stream, TextWriter of XmlWriter om de geserialiseerde output vast te houden
  2. Maak een XmlSerializer object (System.Xml.Serialization) en geef het type mee van het object dat geserialiseerd moet worden.
  3. Roep de methode XmlSerializer.Serialize aan om het object te serialiseren en de output ervan naar de stream te sturen.
// Maak een bestand om de data op te slaan
FilStream fs = new FileStream("serialzed.xml", FileMode.Create);

// Maak een xml serializer object
XmlSerializer xs = new XmlSerializer(typeof(DateTime));

// Serializeer de data
xs.Serialize(fs, System.Datetime.Now);

// Sluit het bestand
fs.Close();


Deserialiseren:
// Open het bestand
FilStream fs = new FileStream("serialzed.xml", FileMode.Open);

// Maak een xml serializer object
XmlSerializer xs = new XmlSerializer(typeof(DateTime));

// Deserializeer de data
DateTime time = (DateTime)xs.Deserialize(fs);

// Sluit het bestand
fs.Close();

Om een class te kunnen serialiseren als XML moet deze aan de volgende punten voldoen:
  1. De class moet public zijn
  2. Specificeer alle members die moeten worden geserialiseerd als public
  3. Maak een parameterloze constructor

Classes die worden geserialiseerd met de xml serializer hoeven NIET de attribuut [Serializable] attribuut te hebben. Als er toch private velden instaan worden deze ovegeslagen bij het serialiseren.

Standaard wordt een class als volgt geserialiseerd door de xml serializer:

public class ShoppingCartItem
{
public int productId;
public decimal price;
public int queantity;
public decimal total;

public ShoppingCartItem()
{
}
}
het geserialiseerde xml bestand ziet er dan als volgt uit:
<?xml version="1.0" ?>
<shoppingcartitem>
<productid>100</productid>
<price>10.25</price>
<total>20.50</total>
<quantity>2</quantity>
</shoppingcartitem>
Er zijn veel attributen beschikbaar om het serialiseren te bepalen (pagina 192 - 194).
[XmlRoot("CartItem")]
public class ShoppingCartItem
{
public int productId;
public decimal price;
public int queantity;
[XmlIgnore]
public decimal total;

public ShoppingCartItem()
{
}
}
het geserialiseerde xml bestand ziet er dan als volgt uit:
<?xml version="1.0" ?>
<CartItem productId="100">
<price>10.25</price>
<quantity>2</quantity>
</shoppingcartitem>

Een instantie van een DataSet kan op dezelfde manier worden geserialiseerd als een 'normaal' object.

Met Xsd.exe, meegeleverd door Visual Studio, kunnen classes worden gegenereerd op basis van een xml schema (xsd bestand). Een xml schema definieert de structuur van een xml bestand.

xsd C:\pad\naar\library.xsd /classes /language:CS

Er is nu een bestand aangemaakt (schema.cs) waarin de class staat gedefineerd.

Reacties

Populaire posts van deze blog

[SQL Server] varchar vs nvarchar

MS Sql 70-461: Chapter 5

[C#] Class serialiseren en deserialiseren