У меня есть класс с именем, который WebserviceType
я получил от инструмента xsd.exe из файла XSD.
Теперь я хочу десериализовать экземпляр WebServiceType
объекта в строку. Как я могу это сделать?
MethodCheckType
Объект имеет , как Params в 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;
Редактировать:
Может быть, я мог бы сказать это другими словами: у меня есть экземпляр этого MethodCheckType
объекта, а с другой стороны, у меня есть XML-документ, из которого я сериализовал этот объект. Теперь я хочу преобразовать этот экземпляр в XML-документ в виде строки. После этого я должен подтвердить, что обе строки (XML-документов) одинаковы. Это я должен сделать, потому что я провожу модульные тесты первого метода, в котором я читаю XML-документ в StringReader
и сериализую его в MethodCheckType
объект.
источник
Ответы:
Вот метод преобразования для обоих способов. this = экземпляр вашего класса
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 ; } }
источник
using
шаблон илиDispose
метод вызова для правильного высвобождения ресурсов.using
? @KvanTTT?Я понимаю, что это очень старый пост, но, посмотрев на ответ LB, я подумал, как я могу улучшить принятый ответ и сделать его общим для моего собственного приложения. Вот что я придумал:
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); } }
источник
Это мое решение, для любого объекта списка вы можете использовать этот код для преобразования в макет 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(); } }
источник
public static class XMLHelper { /// <summary> /// Usage: var xmlString = XMLHelper.Serialize<MyObject>(value); /// </summary> /// <typeparam name="T">Kiểu dữ liệu</typeparam> /// <param name="value">giá trị</param> /// <param name="omitXmlDeclaration">bỏ qua declare</param> /// <param name="removeEncodingDeclaration">xóa encode declare</param> /// <returns>xml string</returns> public static string Serialize<T>(T value, bool omitXmlDeclaration = false, bool omitEncodingDeclaration = true) { if (value == null) { return string.Empty; } try { var xmlWriterSettings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = omitXmlDeclaration, //true: remove <?xml version="1.0" encoding="utf-8"?> Encoding = Encoding.UTF8, NewLineChars = "", // remove \r\n }; var xmlserializer = new XmlSerializer(typeof(T)); using (var memoryStream = new MemoryStream()) { using (var xmlWriter = XmlWriter.Create(memoryStream, xmlWriterSettings)) { xmlserializer.Serialize(xmlWriter, value); //return stringWriter.ToString(); } memoryStream.Position = 0; using (var sr = new StreamReader(memoryStream)) { var pureResult = sr.ReadToEnd(); var resultAfterOmitEncoding = ReplaceFirst(pureResult, " encoding=\"utf-8\"", ""); if (omitEncodingDeclaration) return resultAfterOmitEncoding; return pureResult; } } } catch (Exception ex) { throw new Exception("XMLSerialize error: ", ex); } } private static string ReplaceFirst(string text, string search, string replace) { int pos = text.IndexOf(search); if (pos < 0) { return text; } return text.Substring(0, pos) + replace + text.Substring(pos + search.Length); } }
источник