2013-10-04 2 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()

Вы можете создать общий метод Deserialise, которая использует XmlSerialiser:

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

Сделать общий метод десериализации. Я обновил свой ответ. –

0

Я думаю, самое главное, что вы хотите делать с результатом?

Я имею в виду, что даже с кодом Сэма вы получите результат в переменную, которая будет иметь объект типа. Вы не можете использовать var для этого. Таким образом, с простым десериализом или сэмом Сэма вы получите тот же результат.

Вопрос еще раз в том, что вы хотите сделать с результатом?

Вы бы хотели назвать некоторые распространенные методы? Является ли ISomething общим интерфейсом?

Если это так, и вы знаете это заранее, сделайте все свои типы наследуемыми от чего-то вроде ISomething, а затем отбросьте их на него. Если нет, я не могу вообразить, что вы будете делать с результатом.

Одно и только использование (без общего интерфейса) Я мог бы подумать, что это будет использовать случай для каждого типа и делать разные мысли для каждого конкретного случая ??? Но в этом случае ... вы бы знали тип сериализованного объекта.

Смежные вопросы