Mam klasę o nazwie, WebserviceType
którą otrzymałem z narzędzia xsd.exe z pliku XSD.
Teraz chcę deserializować wystąpienie WebServiceType
obiektu do ciągu. Jak mogę to zrobić?
MethodCheckType
Przedmiot ma za params w WebServiceType
tablicy.
Moja pierwsza próba była taka, jakbym ją serializował: z a XmlSerializer
i StringWriter
(podczas serializacji użyłem a StringReader
).
Oto metoda, w której serializuję WebServiceType
obiekt:
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;
Edytować:
Może mógłbym to powiedzieć innymi słowami: mam instancję tego MethodCheckType
obiektu, az drugiej strony mam dokument XML, z którego serializowałem ten obiekt. Teraz chcę przekonwertować to wystąpienie na dokument XML w postaci ciągu. Następnie muszę udowodnić, czy oba ciągi znaków (dokumentów XML) są takie same. Muszę to zrobić, ponieważ wykonuję testy jednostkowe pierwszej metody, w której wczytuję dokument XML do a StringReader
i serializuję go do MethodCheckType
obiektu.
źródło
Odpowiedzi:
Oto metoda konwersji dla obu sposobów. this = instancja Twojej klasy
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 ; } }
źródło
using
wzorca lubDispose
metody wywołania .using
? @KvanTTT?Zdaję sobie sprawę, że to bardzo stary post, ale po przyjrzeniu się odpowiedzi LB pomyślałem, jak mogę ulepszyć zaakceptowaną odpowiedź i uczynić ją ogólną dla mojej własnej aplikacji. Oto, co wymyśliłem:
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; } }
Te metody można teraz umieścić w statycznej klasie pomocniczej, co oznacza brak duplikowania kodu do każdej klasy wymagającej serializacji.
źródło
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); } }
źródło
To jest moje rozwiązanie, dla dowolnego obiektu listy możesz użyć tego kodu do konwersji do układu XML. KeyFather to Twój główny tag, a KeySon to miejsce, w którym zaczniesz 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(); } }
źródło
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); } }
źródło