2012-07-12 19 views
52

WebserviceType adında bir sınıfım var XsD dosyasındaki xsd.exe aracından aldım.Bir nesneyi XML dizesine dönüştürme

Şimdi bir dizeye WebServiceType nesnesinin bir örneğini serileştirmek istiyorum. Bunu nasıl yapabilirim?

MethodCheckType nesnesinin yolu WebServiceType dizilimine sahiptir.

İlk denemem serileştirilmiş gibiydi: XmlSerializer ve StringWriter (serileştirirken StringReader kullanıyorum).

Bu

ben WebServiceType nesne seri ettiği yöntemdir:

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; 

Düzenleme:

Belki farklı kelimelerle ifade edebilseydim: Bu MethodCheckType nesnesinin bir örneğini var Diğer taraftan, bu nesneyi serileştirdiğim XML belgesine sahibim. Şimdi bu örneği bir dize şeklinde bir XML belgesine dönüştürmek istiyorum. Bundan sonra her iki dizenin (XML belgelerinin) aynı olup olmadığını ispatlamak zorundayım. Bunu yapmak zorundayım çünkü bir XML belgesini StringReader içine okuduğum ve MethodCheckType nesnesine serileştirdiğim ilk yöntemin birim sınamalarını yapıyorum.

+2

Hangi hata var? Ve şartları karıştırıyor olabilirsiniz: serialization (XML dünyasında) * bir nesneyi XML'den * dönüştürüyor; serileştirme * XML'den bir nesneye * dönüşür. Bir XML dizesinden ** bir nesneyi seri hale getirmeye mi çalışıyorsunuz? – carlosfigueira

cevap

116

Her iki yol için de dönüştürme yöntemi. bu Bunun çok eski bir yazı olduğunu fark Sınıfınızla

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 ; 
    } 
+3

Kodunuzu daha genel hale getirmek için 'generics'i kullanabilirsiniz :) –

+8

Doğru kaynak serbest bırakılması için' using 'desenini veya' Dispose 'yöntemini kullanmalısınız. –

+2

Neden? Yönetilmeyen bir referans var ... –

49

örneğini = ama LB'nin tepki baktıktan sonra ben kabul edilen yanıt geliştirmek ve kendi uygulama için bu jenerik yapabiliriz nasıl düşündünüz .

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; 
    } 
} 

Bu yöntemler artık tefrika gereken her sınıf için hiçbir kod çoğaltma anlamına statik yardımcı sınıfı, yerleştirilebilir: İşte ile geldi budur.

+5

"Serileştir" yönteminde, typeof (T) yerine dataToSerialize.GetType() kullanın. İlk bakışta bu, T'yi tür olarak kullanmak için güvenli görünüyor, ancak "dataToSerialize" nesnesinin bir ana türüne (ChildClass'ın BaseClass'a gönderilmesi) atanması bir hata verir.Ve tabi ki ilk boşluğu kontrol et. –

+0

Bir çekicilik gibi çalıştı :-). Iyi ve kolay soln. – Karan

+0

Başka bir şey yapmadan sadece yeniden harekete geçmenin amacı nedir? – crush

14
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); 
     } 
    } 
+1

Serialize, jeneriklere ihtiyaç duyar. Nesne yeterlidir. (dataToSerialize == null) öğesi null olursa; ... var serializer = new XmlSerializer (dataToSerialize.GetType()); ... – AlphaOmega

+0

Belki de 'object' işlevini kullanmak için kaynak kodunu değiştirin. – Kiquenet

İlgili konular