使用目标类型的字符串表示形式进行反序列化
本文关键字:反序列化 表示 字符串 目标 类型 | 更新日期: 2023-09-27 18:33:47
我想反序列化为一个类型,但我只有该类型的字符串表示形式。
我所知道的是该类型实现了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"的对象强制转换为类型 "我的组装.是"
如何转换为存储在typeName
中的类名?
您可以使用:
Type type = Type.GetType(typeName);
要获取的类型的程序集限定名称。看 程序集合格名称。如果类型在当前正在执行的 程序集或在 Mscorlib.dll 中,提供类型名称就足够了 由其命名空间限定。
Type.GetType()
您可以创建一个利用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;
}
}
使用反射调用:
MethodInfo method = typeof(XmlDeserialiser).GetMethod("Deserialise"); // XmlDeserialiser is the class which contains your Deserialise method.
MethodInfo generic = method.MakeGenericMethod(type);
generic.Invoke(this, null);
我认为
最重要的是你想用结果做什么?
我的意思是,即使使用 Sam 的代码,您也会将结果放入一个类型为 object 的变量中。您不能为此使用 var。因此,使用普通反序列化或 Sam 的反序列化,您将获得相同的结果。
我的问题再次是你想用结果做什么?
您想调用一些常用方法吗?是通用接口吗?
如果是这种情况并且您事先知道它,那么让所有类型都继承自 ISomething 之类的东西,然后将它们强制转换为它。如果没有,我无法想象你会用 tre 结果做什么。
我能想到的唯一用法(没有通用接口)是针对每种类型使用案例,并对每种特定情况进行不同的思考???但是在那...箱。。。您将知道序列化对象的类型。