J'ai une classe C # dont j'ai hérité. J'ai réussi à "construire" l'objet. Mais je dois sérialiser l'objet en XML. Existe-t-il un moyen simple de le faire?
Il semble que la classe ait été configurée pour la sérialisation, mais je ne sais pas comment obtenir la représentation XML. Ma définition de classe ressemble à ceci:
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.domain.com/test")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.domain.com/test", IsNullable = false)]
public partial class MyObject
{
...
}
Voici ce que je pensais pouvoir faire, mais cela ne fonctionne pas:
MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();
Comment obtenir la représentation XML de cet objet?
c#
xml-serialization
user462166
la source
la source
Réponses:
Vous devez utiliser XmlSerializer pour la sérialisation XML. Voici un exemple d'extrait.
la source
XmlWriter writer = XmlWriter.Create(sww);
XmlTextWriter writer = new XmlTextWriter(sww) { Formatting = Formatting.Indented };
au lieu deXmlWriter writer = XmlWriter.Create(sww);
XmlWriter
encapsule le,StringWriter
vous n'avez pas besoin de disposer des deux (la première utilisation est redondante), non? Je suppose qu'ilXmlWriter
prend soin de s'en débarrasser ...XmlWriter
pas leStringWriter
, il utilise votre passéStringWriter
et n'a aucune attente / responsabilité de s'en débarrasser. En outreStringWriter
est en dehors deXmlWriter
la portée de, vous pouvez toujours le vouloir lorsqu'ilXmlWriter
est éliminé, ce serait un mauvais comportementXmlWriter
de disposer de votreStringWriter
. En règle générale, si vous déclarez quelque chose qui doit être éliminé, vous êtes responsable de l'éliminer. Et implicitement à cette règle, tout ce que vous ne déclarez pas, vous ne devriez pas en disposer. Les deuxusing
s sont donc nécessaires.J'ai modifié le mien pour retourner une chaîne plutôt que d'utiliser une variable ref comme ci-dessous.
Son utilisation serait la suivante:
la source
Exception
, vous avez étendu le StackTrace avec la méthode "Serialize <>".La fonction suivante peut être copiée dans n'importe quel objet pour ajouter une fonction d'enregistrement XML à l'aide de l'espace de noms System.Xml.
Pour créer l'objet à partir du fichier enregistré, ajoutez la fonction suivante et remplacez [ObjectType] par le type d'objet à créer.
la source
writer.Flush()
est redondant dans unusing
bloc -writer
laDispose()
méthode la videra pour vous.Classe d'extension:
Usage:
Il suffit de faire référence à l'espace de noms tenant votre méthode d'extension dans le fichier que vous souhaitez utiliser et ça va marcher (dans mon exemple , il serait:
using MyProj.Extensions;
)Notez que si vous souhaitez rendre la méthode d'extension spécifique à une classe particulière (par exemple,
Foo
), vous pouvez remplacer l'T
argument dans la méthode d'extension, par exemple.public static string Serialize(this Foo value){...}
la source
Vous pouvez utiliser la fonction comme ci-dessous pour obtenir du XML sérialisé à partir de n'importe quel objet.
Vous pouvez appeler cela depuis le client.
la source
Pour sérialiser un objet, procédez comme suit:
Souvenez-vous également que pour que XmlSerializer fonctionne, vous avez besoin d'un constructeur sans paramètre.
la source
Je vais commencer par la copie de la réponse de Ben Gripka:
J'ai utilisé ce code plus tôt. Mais la réalité a montré que cette solution est un peu problématique. Habituellement, la plupart des programmeurs se contentent de sérialiser les paramètres lors de l'enregistrement et de désérialiser les paramètres lors du chargement. Il s'agit d'un scénario optimiste. Une fois que la sérialisation a échoué, pour une raison quelconque, le fichier est partiellement écrit, le fichier XML n'est pas complet et il n'est pas valide. Par conséquent, la désérialisation XML ne fonctionne pas et votre application peut se bloquer au démarrage. Si le fichier n'est pas énorme, je suggère d'abord de sérialiser l'objet pour
MemoryStream
ensuite écrire le flux dans le fichier. Ce cas est particulièrement important s'il existe une sérialisation personnalisée compliquée. Vous ne pouvez jamais tester tous les cas.La désérialisation dans le scénario du monde réel devrait compter avec un fichier de sérialisation corrompu, cela arrive parfois. La fonction de charge fournie par Ben Gripka est très bien.
Et il pourrait être enveloppé par un scénario de récupération. Il convient aux fichiers de paramètres ou autres fichiers qui peuvent être supprimés en cas de problème.
la source
Toutes les réponses votées ci-dessus sont correctes. Ceci est juste la version la plus simple:
la source
C'est un peu plus compliqué que d'appeler la
ToString
méthode de la classe, mais pas beaucoup.Voici une fonction d'insertion simple que vous pouvez utiliser pour sérialiser tout type d'objet. Il renvoie une chaîne contenant le contenu XML sérialisé:
la source
Voici un bon tutoriel sur la façon de procéder
Vous devez essentiellement utiliser la
System.Xml.Serialization.XmlSerializer
classe pour ce faire.la source
Vous pouvez créer et stocker le résultat sous forme de fichier xml à l'emplacement souhaité.
la source
mon code de travail. Renvoie utf8 xml active l' espace de noms vide.
Exemple de retour de réponse Yandex api payment Aviso url:
la source
J'ai un moyen simple de sérialiser un objet en XML en utilisant C #, cela fonctionne très bien et il est hautement réutilisable. Je sais que c'est un fil plus ancien, mais je voulais le publier car quelqu'un pourrait le trouver utile.
Voici comment j'appelle la méthode:
Voici la classe qui fait le travail:
Remarque: Comme il s'agit de méthodes d'extension, elles doivent être dans une classe statique.
la source
Basé sur les solutions ci-dessus, voici une classe d'extension que vous pouvez utiliser pour sérialiser et désérialiser n'importe quel objet. Toute autre attribution XML dépend de vous.
Utilisez-le simplement comme ceci:
la source
Ou vous pouvez ajouter cette méthode à votre objet:
la source
Voici un code de base qui aidera à sérialiser les objets C # en XML:
la source
Vous devez utiliser les classes suivantes:
la source