2

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

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);
4

3 回答 3

7

做就是了:

object result = formatter.Deserialize(stream); 
Type t = result.GetType();
于 2008-10-20T11:48:59.093 回答
1

主要如leppie所说...

如果你想测试几个已知的类型,你可以使用“is”/“as”:

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

但总的来说,您会让序列化程序担心这些细节......

当然,这与基于 xml 的序列化程序非常不同,因为您需要告诉序列化程序预期什么,而不是序列化程序告诉您它得到了什么。

于 2008-10-20T11:53:30.393 回答
0

几点建议,

  1. 如果您反序列化对象而不强制转换 object myObject = formatter.Deserialize(stream); 然后使用“as”运算符检查与已知类型的类型兼容性,那么这可能会起作用。

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

于 2008-10-20T11:52:11.397 回答