我想反序列化一个对象,但不知道前面的类。所以,请考虑以下代码......

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream("MyFile.bin", FileMode.Open, FileAccess.Read, FileShare.Read);
MyObject obj = (MyObject)formatter.Deserialize(stream);

如果我不了解课程,我该怎么办?比方说,例如“MyFile.bin”。是一个MyObject或MyFoo。如何确定要实例化的对象?

像...一样的东西。

if (magic happens here == typeof(MyObject))  
    MyObject obj = (MyObject) formatter.Deserialize(stream);   
else if (more magic happens here == typeof(MyFoo))  
    MyFoo foo = (MyFoo)formatter.Deserialize(stream);
有帮助吗?

解决方案

只是做:

object result = formatter.Deserialize(stream); 
Type t = result.GetType();

其他提示

主要是因为leppie说......

如果您想针对几种已知类型对其进行测试,可以使用“is”/“作为”:“

MyFoo foo = result As MyFoo;
if(foo != null) { // it was one of those
  // special code
}

但总的来说,你会让串行器担心这些细节......

当然,它与基于xml的序列化程序非常不同,因为您需要告诉序列化程序预期的内容,而不是序列化程序告诉您它的内容。

一些建议,

  1. 如果在不抛出对象的情况下反序列化对象myObject = formatter.Deserialize(stream);然后使用“as”;运算符以检查可能有效的已知类型的类型兼容性。

  2. 看一下SerializationBinder类型的BinaryFormatter.Binder属性,我们之前使用它来为我们的文件格式的旧版本做后向兼容性并且效果很好。基本上允许你完全控制什么东西被反序列化为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top