代码之家  ›  专栏  ›  技术社区  ›  Simon Munro

C#BinaryFormatter-如何找到二进制数据的类?

  •  2
  • Simon Munro  · 技术社区  · 16 年前

    我想反序列化一个对象,但事先不知道类。因此,请考虑以下代码。..

    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);
    
    3 回复  |  直到 16 年前
        1
  •  7
  •   leppie    16 年前

    只要做:

    object result = formatter.Deserialize(stream); 
    Type t = result.GetType();
    
        2
  •  1
  •   Marc Gravell    16 年前

    主要正如麻风病人所说。..

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

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

    但一般来说,您会让序列化程序担心这些细节。..

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

        3
  •  0
  •   Sijin    16 年前

    一些建议,

    1. 如果在不强制转换对象的情况下反序列化对象,则myObject=formatter。反序列化(流);然后使用“as”运算符检查与已知类型的类型兼容性,这样可能会奏效。

    2. 看看BinaryFormatter。Binder属性是序列化绑定器类型,我们以前用它来为旧版本的文件格式提供向后兼容性,效果很好。基本上允许您完全控制反序列化的内容。

    推荐文章