Dot-Net

xml字元串的通用反序列化

  • May 11, 2014

我有一堆不同的 DTO 類。它們在某一時刻被序列化為 XML 字元串,並被傳送到 Web 應用程序的客戶端。現在,當客戶端返回一個 XML 字元串時,我需要將它反序列化回它所代表的 DTO 類的一個實例。問題是我想讓它成為通用的,並且可能是一個函式,它接受一個 xml 字元串並吐出一個類型的對象。就像這些行很長:

public sometype? Deserialize (string xml)
{
//some code here
return objectFromXml;
}

編輯:可怕的例子!我只是自相矛盾!

我不能執行以下操作:

Person person = Deserialize(personXmlStringFromClient);

因為我不知道 personXmlStringFromClient 是 Person DTO 對象實例的表示。

我不知道給了我什麼序列化對象,這似乎是我的問題。我一直在閱讀有關反射和其他涉及將類型粘貼到 xml 中的技術,以便反序列化器知道如何處理它。我似乎無法將它們全部整合到一個工作中。此外,在幾乎大多數範例中,作者都​​知道反序列化後會有什麼類型。歡迎任何建議!如果我需要對序列化過程做一些特別的事情,也請分享。

您可以使用泛型:

   public T Deserialize<T>(string input)
       where T : class
   {
       System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(typeof(T));

       using (StringReader sr = new StringReader(input))
           return (T)ser.Deserialize(sr);
   }

如果您不知道它將是哪種類型,我假設您有固定數量的可能類型,您可以嘗試對每個類型進行反序列化,直到您沒有遇到異常。不是很好,但它會工作。

或者,您可以檢查外部對象名稱的 xml 開頭,並希望能夠從那裡確定類型。這將根據 xml 的外觀而有所不同。

**編輯:**根據您的編輯,如果呼叫者知道他們傳遞的類型,他們是否可以將完全限定的類型名作為字元串作為附加參數提供給服務?

如果是這樣,你可以這樣做:

   Type t = Type.GetType(typeName);

並將 Deserialize 方法更改為:

public object Deserialize(string input, Type toType)
{
   System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(toType);

   using (StringReader sr = new StringReader(input))
       return ser.Deserialize(sr);
}

但是,這只會讓您object

引用自:https://stackoverflow.com/questions/4996876