使用目标类型的字符串表示进行反序列化

时间:2013-10-04 07:15:22

标签: c# .net serialization casting type-conversion

我想反序列化为一个类型,但我只有该类型的字符串表示。

我所知道的是该类型实现了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中存储的班级名称?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我认为最重要的是你想对结果做什么?

我的意思是,即使使用Sam的代码,您也会将结果输入到一个类型为object的变量中。你不能为此使用var。因此,使用简单的反序列化或Sam的一个,您将得到相同的结果。

我的问题是你想要对结果做什么?

您想调用一些常用方法吗? ISomething是一个通用接口吗?

如果是这种情况并且您事先知道,那么让所有类型继承自ISomething之类的东西,然后将它们转换为它。如果没有,我无法想象你会对tre结果做些什么。

我能想到的唯一用法(没有通用接口)将是每种类型的用例,并为每个特定情况做不同的思考??? 但在那个......情况......你会知道序列化对象的类型。