2013-10-04 15 views
1

我想反序列化爲某個類型,但我只有該類型的字符串表示。使用目標類型的字符串表示進行反序列化

我所知道的是該類型實現了ISomething

string typeName = "MyClass"; 

BinaryFormatter binaryFormatter = new BinaryFormatter(); 
byte[] data = Convert.FromBase64String(serialisedString); 

using (MemoryStream memoryStream = new MemoryStream(data, 0, data.Length)) 
{ 
    return (ISomething)binaryFormatter.Deserialize(memoryStream) as ISomething; 
} 

但我得到BinaryFormatter.Deserialize以下異常:

無法轉換類型 'System.RuntimeType' 的對象鍵入 'MyAssembly.ISomething'

如何投影存儲在typeName中的課程名稱?

+0

對象是如何序列化的? – RQDQ

回答

3

您可以使用:

Type type = Type.GetType(typeName); 

類型的程序集限定名稱來獲得。請參閱 AssemblyQualifiedName。如果類型位於當前正在執行的 程序集或Mscorlib.dll中,則只需提供名稱空間限定的類型名稱 就足夠了。

Type.GetType()

您可以創建一個利用XmlSerialiser通用Deserialise方法:

public class XmlDeserialiser 
{ 
    public T Deserialise<T>(string xml) where T : class 
    { 
     T foo; 
     try 
     { 
      var serializer = new XmlSerializer(typeof(T)); 
      foo = (T)serializer.Deserialize(new XmlTextReader(new System.IO.StringReader(xml))); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Failed to Deserialise " + xml + " " + ex); 
      throw; 
     } 

     return foo; 
    } 
} 

使用呼叫reflection

MethodInfo method = typeof(XmlDeserialiser).GetMethod("Deserialise"); // XmlDeserialiser is the class which contains your Deserialise method. 
MethodInfo generic = method.MakeGenericMethod(type); 
generic.Invoke(this, null); 
+0

那麼我該如何轉換成'type'? – davenewza

+0

製作一個通用的Deserialise方法。我已經更新了我的答案。 –

0

我認爲最重要的是你要什麼結果如何?

我的意思是,即使有Sam的代碼,你也會得到一個變量,該變量將是類型對象。你不能爲此使用var。所以用簡單的反序列化或Sam的一個,你會得到相同的結果。

我的問題再次是你想要做的結果?

你想調用一些常用的方法嗎? ISomething是一個通用的接口嗎?

如果是這種情況,你事先知道它,然後讓所有的類型從ISomething繼承,然後將它們投射到它。如果沒有,我不能想象你會用tre結果做什麼。

我能想到的唯一的用法(沒有通用接口)將用於每種類型的用例,並針對每種特定情況做不同的考慮。 但是,在這種情況下...你會知道序列化對象的類型。

相關問題