336 votes

Sérialiser un objet en XML

J'ai une classe C# que j'ai hérité. J'ai réussi à le "construit" de l'objet. Mais j'ai besoin de sérialiser l'objet XML. Ma question est, est-il un moyen facile de le faire? Il ressemble à la classe a été mis en place pour la sérialisation, mais je ne suis pas sûr de la façon d'obtenir la représentation XML. Ma définition de la 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 j'ai pensé que je pouvais le faire, mais ça ne fonctionne pas:

MyObject o = new MyObject();
// Set o properties
string xml = o.ToString();

Comment puis-je obtenir la représentation XML de cet objet?

596voto

RameshVel Points 24472

Vous devez utiliser XmlSerializer pour la sérialisation XML, sous l'extrait de code

  XmlSerializer xsSubmit = new XmlSerializer(typeof(MyObject));
 var subReq = new MyObject();
 StringWriter sww = new StringWriter();
 XmlWriter writer = XmlWriter.Create(sww);
 xsSubmit.Serialize(writer, subReq);
 var xml = sww.ToString(); // Your xml
 

132voto

Kwex Points 859

Merci Imrul. J'ai modifié le mien pour retourner une chaîne plutôt que d'utiliser une variable ref comme ci-dessous

 public static string Serialize<T>(this T value)
{
    if (value == null)
    {
        return string.Empty;
    }
    try
    {
        var xmlserializer = new XmlSerializer(typeof(T));
        var stringWriter = new StringWriter();
        using (var writer = XmlWriter.Create(stringWriter))
        {
            xmlserializer.Serialize(writer, value);
            return stringWriter.ToString();
        }
    }
    catch (Exception ex)
    {
        throw new Exception("An error occurred", ex);
    }
}
 

Son utilisation serait comme ça:

 var xmlString = obj.Serialize();
 

48voto

Ben Gripka Points 4885

Cette fonction peut être copiée dans n'importe quel objet pour ajouter une fonction de sauvegarde xml à l'aide de l'espace de noms System.Xml.

 /// <summary>
/// Saves to an xml file
/// </summary>
/// <param name="FileName">File path of the new xml file</param>
public void Save(string FileName)
{
    using (var writer = new System.IO.StreamWriter(FileName))
    {
        var serializer = new XmlSerializer(this.GetType());
        serializer.Serialize(writer, this);
        writer.Flush();
    }
}
 

Pour créer l'objet à partir du fichier enregistré, ajoutez cette fonction et remplacez [ObjectType] par le type d'objet à créer.

 /// <summary>
/// Load an object from an xml file
/// </summary>
/// <param name="FileName">Xml file name</param>
/// <returns>The object created from the xml file</returns>
public static [ObjectType] Load(string FileName)
{
    using (var stream = System.IO.File.OpenRead(FileName))
    {
        var serializer = new XmlSerializer(typeof([ObjectType]));
        return serializer.Deserialize(stream) as [ObjectType];
    }
}
 

31voto

Imrul Points 1486

Vous pouvez utiliser la fonction ci-dessous pour obtenir du XML sérialisé à partir de n’importe quel objet.

 public static bool Serialize<T>(T value, ref string serializeXml)
{
    if (value == null)
    {
        return false;
    }
    try
    {
        XmlSerializer xmlserializer = new XmlSerializer(typeof(T));
        StringWriter stringWriter = new StringWriter();
        XmlWriter writer = XmlWriter.Create(stringWriter);

        xmlserializer.Serialize(writer, value);

        serializeXml = stringWriter.ToString(); 

        writer.Close();
        return true;
    }
    catch (Exception ex)
    {
        return false;
    }
}
 

Vous pouvez appeler cela du client.

21voto

Rox Points 1214

Pour sérialiser un objet:

  using (StreamWriter myWriter = new StreamWriter(path, false))
 {

     XmlSerializer mySerializer = new XmlSerializer(typeof(your_object_type));
     mySerializer.Serialize(myWriter, objectToSerialize);
 }
 

Edit: rappelez-vous également que pour que XmlSerializer fonctionne, vous avez besoin d'un constructeur sans paramètre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X