Подтвердить что ты не робот

Преобразование объекта в строку XML

У меня есть класс с именем WebserviceType, который я получил из инструмента xsd.exe из файла XSD.

Теперь я хочу десериализовать экземпляр объекта WebserviceType для строки. Как я могу это сделать?

Объект MethodCheckType имеет в качестве параметров a WebserviceType массив.

Моя первая попытка была такой, как я сериализовал ее: с XmlSerializer и a StringWriter (при сериализации я использовал StringReader).

Это метод, в котором я сериализую объект 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;

Изменить:

Возможно, я мог бы сказать это разными словами: у меня есть экземпляр этого объекта MethodCheckType, с другой стороны, у меня есть документ XML, из которого я сериализовал этот объект. Теперь я хочу преобразовать этот экземпляр в XML-документ в виде строки. После этого я должен подтвердить, что обе строки (XML-документов) одинаковы. Это я должен сделать, потому что я делаю модульные тесты первого метода, в котором я прочитал XML-документ в StringReader и сериализую его в объект MethodCheckType.

4b9b3361

Ответ 1

Вот метод преобразования для обоих способов. это = экземпляр вашего класса

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

Ответ 2

Я понимаю, что это очень старый пост, но, взглянув на ответ L.B, я подумал о том, как я мог бы улучшить принятый ответ и сделать его общим для моего собственного приложения. Вот что я придумал:

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

Теперь эти методы могут быть помещены в статический вспомогательный класс, что означает отсутствие дублирования кода для каждого класса, который должен быть сериализован.

Ответ 3

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

Ответ 4

Это мое решение, для любого объекта списка вы можете использовать этот код для преобразования в формат XML. KeyFather - ваш основной тег, а KeySon - то, с чего начинается ваш 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();
        }
    }