Преобразование объекта в строку XML
у меня есть класс с именем WebserviceType
Я получил от инструмента xsd.exe из файла XSD.
теперь я хочу десериализовать экземпляр WebServiceType
объект в строку.
Как я могу это сделать?
The MethodCheckType
объект имеет в качестве параметров a WebServiceType
массив.
моя первая попытка была, как я сериализовать его: с XmlSerializer
и 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;
Edit:
может быть, я мог бы сказать это другими словами: у меня есть экземпляр этого MethodCheckType
объект с другой стороны у меня есть XML-документ, из которого я сериализовать этот объект. Теперь я хочу преобразовать этот экземпляр в XML-документ в виде строки. После этого я должен доказать, что обе строки (XML-документов) одинаковы. Это я должен сделать, потому что я делаю модульные тесты первого метода, в котором я читаю XML-документ в StringReader
и сериализовать его в MethodCheckType
"объект".
3 ответа:
вот метод преобразования для обоих способов. это = экземпляр вашего класса
public string ToXML() { 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) { var stringReader = new System.IO.StringReader(xmlText); var serializer = new XmlSerializer(typeof(YourClass )); return serializer.Deserialize(stringReader) as YourClass ; }
Я понимаю, что это очень старый пост, но после просмотра ответа 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; } }
эти методы теперь могут быть помещены в статический вспомогательный класс, что означает отсутствие дублирования кода для каждого класса, который должен быть сериализован.
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); } }