web-dev-qa-db-fra.com

Convertir un objet en chaîne XML

J'ai une classe nommée WebserviceType que j'ai obtenue de l'outil xsd.exe à partir d'un fichier XSD. 

Maintenant, je veux désérialiser une instance d'un objet WebServiceType en chaîne. Comment puis-je faire ceci?

L'objet MethodCheckType a pour paramètres un tableau WebServiceType.

Mon premier essai a été comme si je l'avais sérialisé: avec un XmlSerializer et un StringWriter (lors de la sérialisation, j'ai utilisé un StringReader).

Voici la méthode dans laquelle je sérialise l'objet WebServiceType:

XmlSerializer serializer = new XmlSerializer(typeof(MethodCheckType));
        MethodCheckType output = null;
        StringReader reader = null;

        // catch global exception, logg it and throw it
        try
        {
            reader = new StringReader(path);
            output = (MethodCheckType)serializer.Deserialize(reader);
        }
        catch (Exception)
        {
            throw;
        }
        finally
        {
            reader.Dispose();
        }

        return output.WebService;

Modifier: 

Peut-être que je pourrais le dire avec des mots différents: j'ai une instance de cet objet MethodCheckType et, en revanche, le document XML à partir duquel j'ai sérialisé cet objet. Maintenant, je veux convertir cette instance en un document XML sous la forme d'une chaîne. Après cela, je dois vérifier si les deux chaînes (de documents XML) sont identiques. Je dois le faire, car je fais des tests unitaires de la première méthode dans laquelle je lis un document XML dans un StringReader et le sérialise dans un objet MethodCheckType.

69
FluepkeSchaeng

Voici une méthode de conversion pour les deux méthodes . This = instance de votre classe

public string ToXML()
    {
        using(var stringwriter = new System.IO.StringWriter())
        { 
            var serializer = new XmlSerializer(this.GetType());
            serializer.Serialize(stringwriter, this);
            return stringwriter.ToString();
        };
    }

 public static YourClass LoadFromXMLString(string xmlText)
    {
        using(var stringReader = new System.IO.StringReader(xmlText))
        {
            var serializer = new XmlSerializer(typeof(YourClass ));
            return serializer.Deserialize(stringReader) as YourClass ;
        };
    }
150
Tomas Grosup

Je réalise que c'est un très vieux billet, mais après avoir examiné la réponse de L.B, j'ai réfléchi à la manière d'améliorer la réponse acceptée et de la rendre générique pour ma propre application. Voici ce que je suis venu avec:

public static string Serialize<T>(T dataToSerialize)
{
    try
    {
        var stringwriter = new System.IO.StringWriter();
        var serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stringwriter, dataToSerialize);
        return stringwriter.ToString();
    }
    catch
    {
        throw;
    }
}

public static T Deserialize<T>(string xmlText)
{
    try
    {
        var stringReader = new System.IO.StringReader(xmlText);
        var serializer = new XmlSerializer(typeof(T));
        return (T)serializer.Deserialize(stringReader);
    }
    catch
    {
        throw;
    }
}

Ces méthodes peuvent maintenant être placées dans une classe d'assistance statique, ce qui signifie aucune duplication de code pour chaque classe devant être sérialisée.

65
William Smith
    public static string Serialize(object dataToSerialize)
    {
        if(dataToSerialize==null) return null;

        using (StringWriter stringwriter = new System.IO.StringWriter())
        {
            var serializer = new XmlSerializer(dataToSerialize.GetType());
            serializer.Serialize(stringwriter, dataToSerialize);
            return stringwriter.ToString();
        }
    }

    public static T Deserialize<T>(string xmlText)
    {
        if(String.IsNullOrWhiteSpace(xmlText)) return default(T);

        using (StringReader stringReader = new System.IO.StringReader(xmlText))
        {
            var serializer = new XmlSerializer(typeof(T));
            return (T)serializer.Deserialize(stringReader);
        }
    }

Ceci est ma solution, pour tout objet de liste, vous pouvez utiliser ce code pour convertir en mise en page XML. KeyFather est votre tag principal et KeySon est le point de départ de votre Forech.

public string BuildXml<T>(ICollection<T> anyObject, string keyFather, string keySon)
    {
        var settings = new XmlWriterSettings
        {
            Indent = true
        };
        PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
        StringBuilder builder = new StringBuilder();
        using (XmlWriter writer = XmlWriter.Create(builder, settings))
        {
            writer.WriteStartDocument();
            writer.WriteStartElement(keyFather);
            foreach (var objeto in anyObject)
            {
                writer.WriteStartElement(keySon);
                foreach (PropertyDescriptor item in props)
                {
                    writer.WriteStartElement(item.DisplayName);
                    writer.WriteString(props[item.DisplayName].GetValue(objeto).ToString());
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            writer.WriteFullEndElement();
            writer.WriteEndDocument();
            writer.Flush();
            return builder.ToString();
        }
    }
0
Fred Peixoto