Saya punya kelas bernama WebserviceType
saya dapatkan dari alat xsd.exe dari file XSD.
Sekarang saya ingin deserialize instance WebServiceType
objek menjadi string. Bagaimana saya bisa melakukan ini?
The MethodCheckType
objek memiliki sebagai params sebuah WebServiceType
array yang.
Percobaan pertama saya seperti saya membuat serialnya: dengan a XmlSerializer
dan a StringWriter
(sementara serialisasi saya menggunakan a StringReader
).
Ini adalah metode di mana saya membuat serial WebServiceType
objek:
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:
Mungkin saya bisa mengatakannya dengan kata-kata yang berbeda: Saya telah mendapat contoh dari MethodCheckType
objek ini dan di sisi lain saya telah mendapatkan dokumen XML dari mana saya membuat serial objek ini. Sekarang saya ingin mengubah contoh ini menjadi dokumen XML dalam bentuk string. Setelah ini saya harus membuktikan apakah kedua string (dokumen XML) sama. Ini harus saya lakukan, karena saya membuat tes unit dari metode pertama di mana saya membaca dokumen XML menjadi StringReader
dan menserialisasinya menjadi MethodCheckType
objek.
sumber
Jawaban:
Berikut adalah metode konversi untuk kedua cara tersebut. this = instance dari kelas Anda
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 ; } }
sumber
using
pola atauDispose
metode panggilan untuk melepaskan sumber daya yang benar.using
? @TokopediaSaya menyadari ini adalah posting yang sangat lama, tetapi setelah melihat tanggapan LB, saya berpikir tentang bagaimana saya dapat meningkatkan jawaban yang diterima dan menjadikannya umum untuk aplikasi saya sendiri. Inilah yang saya dapatkan:
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; } }
Metode ini sekarang dapat ditempatkan di kelas pembantu statis, yang berarti tidak ada duplikasi kode untuk setiap kelas yang perlu diserialkan.
sumber
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); } }
sumber
Ini adalah solusi saya, untuk objek daftar apa pun Anda dapat menggunakan kode ini untuk dikonversi ke tata letak xml. KeyFather adalah tag utama Anda dan KeySon adalah tempat memulai Forech Anda.
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(); } }
sumber
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); } }
sumber