Je suis actuellement à la recherche d'un moyen simple de sérialiser des objets (en C# 3).
J'ai cherché des exemples sur Google et j'ai trouvé quelque chose comme ça :
MemoryStream memoryStream = new MemoryStream ( );
XmlSerializer xs = new XmlSerializer ( typeof ( MyObject) );
XmlTextWriter xmlTextWriter = new XmlTextWriter ( memoryStream, Encoding.UTF8 );
xs.Serialize ( xmlTextWriter, myObject);
string result = Encoding.UTF8.GetString(memoryStream .ToArray());
Après avoir lu ceci question Je me suis demandé, pourquoi ne pas utiliser StringWriter ? Cela semble beaucoup plus facile.
XmlSerializer ser = new XmlSerializer(typeof(MyObject));
StringWriter writer = new StringWriter();
ser.Serialize(writer, myObject);
serializedValue = writer.ToString();
Un autre problème était que le premier exemple générait un XML que je ne pouvais pas simplement écrire dans une colonne XML de la base de données SQL Server 2005.
La première question est la suivante : y a-t-il une raison pour laquelle je ne devrais pas utiliser StringWriter pour sérialiser un objet lorsque j'en ai besoin sous forme de chaîne par la suite ? Je n'ai jamais trouvé de résultat utilisant StringWriter en cherchant sur Google.
La seconde est, bien sûr : Si vous ne devez pas le faire avec StringWriter (pour n'importe quelles raisons), quelle serait la bonne et correcte manière ?
Ajout :
Comme cela a déjà été mentionné dans les deux réponses, je vais approfondir le problème du XML vers la base de données.
Lors de l'écriture dans la base de données, j'ai obtenu l'exception suivante :
System.Data.SqlClient.SqlException : XML parsing : ligne 1, caractère 38, impossible de changer l'encodage
Pour la chaîne
<?xml version="1.0" encoding="utf-8"?><test/>
J'ai pris la chaîne créée à partir du XmlTextWriter et j'ai simplement mis comme xml là. Celui-ci n'a pas fonctionné (ni avec l'insertion manuelle dans la BD).
Ensuite, j'ai essayé l'insertion manuelle (en écrivant simplement INSERT INTO ... ) avec encodage="utf-16", ce qui a également échoué. La suppression de l'encodage a alors fonctionné. Après ce résultat, je suis revenu au code StringWriter et voilà, ça a marché.
Problème : je ne comprends pas vraiment pourquoi.
à Christian Hayter : Avec ces tests, je ne suis pas sûr que je doive utiliser utf-16 pour écrire dans la BD. Est-ce que le fait de mettre l'encodage en UTF-16 (dans la balise xml) ne fonctionnerait pas alors ?