it-swarm.dev

Převést objekt na řetězec XML

Mám třídu s názvem WebserviceType jsem dostal z nástroje xsd.exe ze souboru XSD. 

Nyní chci deserializovat instanci WebServiceType objektu na řetězec. Jak to mohu udělat?

Objekt MethodCheckType má pole param_sWebServiceType.

Můj první pokus byl takový, že jsem to serializoval: s XmlSerializer a StringWriter (při serializaci jsem použil StringReader).

Toto je metoda, ve které serializuji objekt 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;

Upravit: 

Možná bych to mohl říci různými slovy: Mám instanci tohoto objektu MethodCheckType a na druhou stranu mám XML dokument, ze kterého jsem tento objekt serializoval. Nyní chci převést tuto instanci do XML dokumentu ve formě řetězce. Poté musím prokázat, zda jsou oba řetězce (dokumenty XML) stejné. To musím udělat, protože dělám jednotkové testy první metody, ve které jsem si přečetl dokument XML do StringReader a serializoval do objektu MethodCheckType.

69
FluepkeSchaeng

Zde je metoda konverze pro oba způsoby. This = instance vaší třídy

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

Uvědomuji si, že se jedná o velmi starý příspěvek, ale když jsem se podíval na odpověď L.B, přemýšlel jsem o tom, jak se mohu zlepšit na přijaté odpovědi a učinit z ní obecnou aplikaci. Zde je to, co jsem přišel:

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;
    }
}

Tyto metody lze nyní umístit do třídy statických pomocníků, což znamená, že není nutné duplikovat kód pro každou třídu, kterou je třeba serializovat.

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);
        }
    }

Toto je moje řešení, pro každý objekt seznamu můžete tento kód použít pro převod do formátu XML. KeyFather je vaše hlavní značka a KeySon je místo, kde začíná váš 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