J'ai la méthode suivante pour enregistrer un objet dans un fichier:
// Save an object out to the disk
public static void SerializeObject<T>(this T toSerialize, String filename)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
TextWriter textWriter = new StreamWriter(filename);
xmlSerializer.Serialize(textWriter, toSerialize);
textWriter.Close();
}
J'avoue que je ne l'ai pas écrit (je l'ai seulement converti en une méthode d'extension qui a pris un paramètre de type).
Maintenant, j'en ai besoin pour me rendre le xml sous forme de chaîne (plutôt que de l'enregistrer dans un fichier). Je l'examine, mais je ne l'ai pas encore compris.
J'ai pensé que cela pourrait être vraiment facile pour quelqu'un qui connaît ces objets. Sinon, je le découvrirai finalement.
la source
typeof(T)
versustoSerialize.GetType()
, veuillez le faire, mais pas dans ma réponse. Merci.Je sais que ce n'est pas vraiment une réponse à la question, mais sur la base du nombre de votes pour la question et la réponse acceptée, je soupçonne que les gens utilisent réellement le code pour sérialiser un objet en chaîne.
L'utilisation de la sérialisation XML ajoute des déchets de texte supplémentaires inutiles à la sortie.
Pour la classe suivante
il génère
La meilleure solution consiste à utiliser la sérialisation JSON (l'un des meilleurs est Json.NET ). Pour sérialiser un objet:
Pour désérialiser un objet:
La chaîne JSON sérialisée ressemblerait à:
la source
Sérialiser et désérialiser (XML / JSON):
la source
Code de sécurité
En ce qui concerne la réponse acceptée , il est important d'utiliser au
toSerialize.GetType()
lieu detypeof(T)
dans leXmlSerializer
constructeur: si vous utilisez le premier code couvre tous les scénarios possibles, tout en utilisant ce dernier on échoue parfois.Voici un lien avec un exemple de code qui motive cette instruction, avec le
XmlSerializer
lancement d'une exception lorsquetypeof(T)
est utilisé, car vous passez une instance d'un type dérivé à une méthode qui appelleSerializeObject<T>()
qui est définie dans la classe de base du type dérivé: http: // ideone .com / 1Z5J1 . Notez que Ideone utilise Mono pour exécuter le code: l'exception réelle que vous obtiendriez en utilisant le runtime Microsoft .NET a un message différent de celui affiché sur Ideone, mais il échoue tout de même.Par souci d'exhaustivité, je poste ici l'exemple de code complet pour référence future, juste au cas où Ideone (où j'ai posté le code) deviendrait indisponible à l'avenir:
la source
using (StringWriter textWriter = new StringWriter() {}
pour la fermeture / élimination appropriée de l'objet.using
est le meilleur ami à la fois pour nous et pour nos chersIDisposable
objets de mise en œuvre;)Mon 2p ...
la source
la source
Je n'ai pas pu utiliser la méthode JSONConvert suggérée par xhafan
Dans .Net 4.5, même après avoir ajouté la référence d'assembly "System.Web.Extensions", je n'ai toujours pas pu accéder à JSONConvert.
Cependant, une fois la référence ajoutée, vous pouvez imprimer la même chaîne en utilisant:
la source
Je me sentais comme si j'avais besoin de partager ce code manipulé à la réponse acceptée - comme je n'ai pas de réputation, je ne peux pas commenter ..
la source
Dans certains cas rares, vous souhaiterez peut-être implémenter votre propre sérialisation de chaîne.
Mais c'est probablement une mauvaise idée à moins que vous sachiez ce que vous faites. (par exemple, sérialisation des E / S avec un fichier de commandes)
Quelque chose comme ça ferait l'affaire (et il serait facile de le modifier à la main / par lot), mais faites attention à ce que d'autres vérifications soient effectuées, comme si ce nom ne contient pas de nouvelle ligne.
la source
[VB]
[C #]
la source