mercoledì 24 novembre 2010

XmlSerializer ,list ,CollectionBase, Array

Meno male che ho 5 min per postare quest'esempio.. il cui prò ha poco senso, ma potrebbe chiarire qualche cosa su come si comporta la serializzazione in xml...

Come sempre il post sarà lunghetto, armatevi di pazienza e buona lettura.

partiamo da una cosa semplice un Entity più o meno banale.

public class Entity
{
#region Private
private int _UserID;
private string _UserName;
private string _UserSurname;
private DateTime _UserBirth;
private string _UserAddress;
#endregion


#region Public
public int UserID
{
get { return _UserID; }
set { _UserID = value; }
}

public string UserName
{
get { return _UserName; }
set { _UserName = value; }
}

public string UserSurname
{
get { return _UserSurname; }
set { _UserSurname = value; }
}

public DateTime UserBirth
{
get { return _UserBirth; }
set { _UserBirth = value; }
}

public string UserAddress
{
get { return _UserAddress; }
set { _UserAddress = value; }
}
#endregion
}

Nulla di davvero eccezionale...

Quindi passiamo alle possibili collezioni ...

public class Entities:List
{
}

public class collectionEntities : System.Collections.CollectionBase
{
public void Add(Entity et)
{
this.List.Add(et);
}
}


public class GenericEntities
{

public class Item
{
private Item next;

private T data;


public Item Next
{
get { return next; }
set { next = value; }
}


public T Data
{
get { return data; }
set { data = value; }
}


public Item(T t)
{
next = null;
Data = t;
}
}

private Item Element;

public GenericEntities()
{
Element = null;
}

public void Add(T t)
{
Item i = new Item(t);
i.Next = Element;
Element = i;
}

public IEnumerator GetEnumerator()
{
Item current = Element;
while (current != null)
{
yield return current.Data;
current = current.Next;
}
}
}

e quindi i serializer ...

public static class SerializerTool
{
public static string Serialize(Entities eList)
{
XmlSerializer xmls = new XmlSerializer(typeof(Entities));


StringWriter sw = new StringWriter();

xmls.Serialize(sw, eList);


return sw.ToString();
}

public static string Serialize(Entity[] eList)
{
XmlSerializer xmls = new XmlSerializer(typeof(Entity[]));


StringWriter sw = new StringWriter();

xmls.Serialize(sw, eList);


return sw.ToString();
}

public static string Serialize(collectionEntities eList)
{
XmlSerializer xmls = new XmlSerializer(typeof(collectionEntities));


StringWriter sw = new StringWriter();

xmls.Serialize(sw, eList);


return sw.ToString();
}

public static string Serialize(GenericEntities eList)
{
XmlSerializer xmls = new XmlSerializer(typeof(GenericEntities));


StringWriter sw = new StringWriter();

xmls.Serialize(sw, eList);


return sw.ToString();
}
}

bene questo è tutto quello che ci serve o quasi per il nostro esempio..

manca solo il main

class Program
{
static void Main(string[] args)
{

#region Entity Creation
Entity e1 = new Entity();

e1.UserName = "Mario";
e1.UserSurname = "Rossi";
e1.UserBirth = DateTime.Parse("01/01/1994");
e1.UserAddress = "via roma n1 ";


Entity e2 = new Entity();

e2.UserName = "Davide";
e2.UserSurname = "Bianchi";
e2.UserBirth = DateTime.Parse("05/05/1996");
e2.UserAddress = "via milano n2 ";

Entity e3 = new Entity();

e3.UserName = "Giorgio";
e3.UserSurname = "Verdi";
e3.UserBirth = DateTime.Parse("05/05/1996");
e3.UserAddress = "via torino n3";
#endregion


// LIST T
Entities el = new Entities();

el.Add(e1);
el.Add(e2);
el.Add(e3);

Console.WriteLine("List T");
Console.WriteLine(SerializerTool.Serialize(el));

Console.ReadLine();

// Array
Entity[] eA = new Entity[3];

eA[0] = e1;
eA[1] = e2;
eA[2] = e3;

Console.WriteLine("ARRAY");
Console.WriteLine(SerializerTool.Serialize(eA));

Console.ReadLine();

// collectionBase
collectionEntities eC = new collectionEntities();

eC.Add(e1);
eC.Add(e2);
eC.Add(e3);

Console.WriteLine("Collection");
Console.WriteLine(SerializerTool.Serialize(eA));

Console.ReadLine();


GenericEntities gE = new GenericEntities();

gE.Add(e1);
gE.Add(e2);
gE.Add(e3);

Console.WriteLine("Generics");
Console.WriteLine(SerializerTool.Serialize(eA));

Console.ReadLine();

}
}

Io che sono più o meno testardo provando questo codice non i sono accorto di grandi differenze,
tanto che l'xml risultante è uguale per tutti ...
Che cosa cambia quindi ? I tempi ? I pesi ? L'occupazione di memoria ?

Per List e Arry non ho scritto righe di codice per Collection ho dovuto implementare il metodo Add ( ma è specializzato solo per le Entity ) per Generics ho dovuto implementare
tutto o quasi ma posso riutilizzare il codice completamente per altri scopi...

Quindi a parità di risultati possiamo ancora una volta scegliere differenti modalità di implementazione.

Nessun commento: