Saturday, November 1, 2008

XmlSerialisation en c#

La serialisation est une technique pratique.
En dotnet 2 elle est facilitée par des elements du framework.

Le compilateur utilise des nouveau mot clés et meme concept tres interressant:
c'est des directive entre [... ]

Attention cela n'a rien a voir avec la precompilation , qui reste assez basique.
C# possede aussi un preprocesseur

Cela sert a la serialisation et aussi pour des elements d'ihm dans les propertyGrid.
j'ai helas pas plus de renseignement a vous donner ici.


Plus de renseingement ici

using System.Xml.Serialization;

Apres indiqué avant la déclaration de la classe :
[Serializable]

et si c'est l'element racine :
[System.Xml.Serialization.XmlRoot("MaClasseSerialisee")]
ou
pour d'autre element
[System.Xml.Serialization.XmlElementAttribute("Employee")]

Pour ajouter des attributs:
[XmlAttributeAttribute(DataType = "string")]

Mon probleme etait de serialisé un Generics du Style List
mListImg;
Et pour cela j'ai utilisé des getter/setter transformant le type en string[] et ca marche :).

Exemple :

[Serializable]

[XmlRootAttribute("ConfigGallery", Namespace = "", IsNullable = false)]

public class ConfigGalllery

{

[XmlAttributeAttribute(DataType = "int")]

public int widthThumb;

[XmlAttributeAttribute(DataType = "int")]
public int row;
[XmlAttributeAttribute(DataType = "int")]
public int column;
[XmlElement(DataType = "string")]
public string mFinalDirectory;

[XmlIgnoreAttribute()]
List mListImg;

[XmlArrayItem("ListItem", typeof(string))]
[XmlArray("List")]

public string[] ImgList{
get
{
string[] a = new string[mListImg.imgs.Count];
int n= 0;
foreach (string t in mListImg)
{
a[n++]= t;
}
return a;
}
set
{
mListImg = new List();
foreach(string s in value )
{
mListImg.AddImage(s);
}
}
}


Résultat:
configgallery xsi="http://www.w3.org/2001/XMLSchema-instance" xsd="http://www.w3.org/2001/XMLSchema" widththumb="0" row="0" column="0">
list>
listitem>C:\motion.png< /listitem>
listitem>C:\testPicture.jpeg /listitem>
/list>
/configgallery>

Avec comme methode pour serialisé

public void SaveConfig(string fileName)
{
StreamWriter writer = null;
try
{
XmlSerializer ser = new XmlSerializer(typeof(UltimateThumbnailCreator.core.ConfigGalllery));
writer = new StreamWriter(fileName);
ser.Serialize(writer, this);
}
catch (Exception ex)
{

Réf: http://www.codeproject.com/KB/XML/GameCatalog.aspx

Ref: http://www.codeproject.com/KB/XML/xml_serializationasp.aspx

. XML Data Files, XML Serialization, and .NET


Cependant la serialisation à encore quelques secrets pour moi
Un lien tres intéressante pour créer vos classes à partir d'un fichier xml :
http://www.bonesoft.com/XmlModeler/Demo.aspx


No comments: