2012-07-12 220 views
52

我有一個名爲WebserviceType的類,我從XSD文件的工具xsd.exe中獲得了該類。將對象轉換爲XML字符串

現在我想將一個WebServiceType對象的實例反序列化爲一個字符串。 我該怎麼做?

MethodCheckType對象具有作爲參數的WebServiceType數組。

我第一次嘗試像我連載它:用XmlSerializerStringWriter(序列化時我用了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對象。

+2

你會得到什麼錯誤?你可能會混淆這些術語:序列化(在XML世界中)是將*從一個對象轉換成XML *;反序列化將*從XML轉換爲對象*。你是否想從**一個XML字符串反序列化一個對象**? – carlosfigueira 2012-07-12 08:13:40

回答

116

這裏是兩種方式的轉換方法。 此=類

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

您可以使用'泛型'使您的代碼更通用:) – 2012-07-12 09:07:14

+8

您應該使用'使用'模式或調用'Dispose'方法來釋放正確的資源。 – 2013-11-23 12:01:58

+2

爲什麼?沒有使用非託管參考... – 2013-11-23 21:59:28

49

的情況下我意識到這是一個非常古老的職位,但看着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; 
    } 
} 

這些方法現在可以放置在靜態輔助類,這意味着沒有重複代碼到每個需要被序列化類。

+5

在「Serialize」方法上,使用dataToSerialize.GetType()而不是typeof(T)。乍一看,這似乎是安全的使用T作爲類型,但如果「dataToSerialize」對象已轉換爲父類型(ChildClass轉換爲BaseClass)它將引發錯誤。當然,首先檢查它爲空。 – 2015-10-22 03:13:58

+0

它像一個魅力:-)。好&容易soln。 – Karan 2016-06-23 14:56:26

+0

捕捉的重點是什麼? – crush 2018-02-20 22:10:18

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

序列化確實需要泛型。對象就夠了。 if(dataToSerialize == null)返回null; ... var serializer = new XmlSerializer(dataToSerialize.GetType()); ... – AlphaOmega 2014-04-23 15:21:58

+0

也許更改使用'object'的源代碼? – Kiquenet 2015-11-26 15:30:59