出于听觉原因,我使用binaryformatter将业务方法的参数序列化为数据库中的二进制格式。
问题在于,当参数是泛型列表时,我无法找到转换反序列化对象的方法,因为我不知道类型,或者即使知道类型,也不知道如何在运行时转换对象。
有人知道如何在运行时动态地转换包含泛型列表的对象吗?
我需要这样做是因为我需要在属性网格中显示反序列化数据:
object objArg = bformatter.Deserialize(memStr);
//If the type is a clr type (int, string, etc)
if (objArg.GetType().Module.Name == "mscorlib.dll")
{
//If the type is a generic type (List<>, etc)
//(I'm only use List for these cases)
if (objArg.GetType().IsGenericType)
{
// here is the problem
pgArgsIn.SelectedObject = new { Value = objArg};
//In the previous line I need to do something like...
//new { Value = (List<objArg.GetYpe()>) objArg};
}
else
{
pgArgsIn.SelectedObject = new { Value = objArg.ToString() };
}
}
else
{
//An entity object
pgArgsIn.SelectedObject = objArg;
}
BinaryFormatter
将非常脆弱。我建议使用基于契约的序列化程序,例如XmlSerializer
、DataContractSerializer
或(对于二进制)protobuf-net
。 - Marc Gravell