Преобразование объекта в строку 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
.
Ответы
Ответ 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();
}
}