如何将未知类型的对象写入二进制文件?

时间:2013-06-16 23:50:27

标签: c# binary binarywriter

这基本上就像一个通用的二进制编写器...假设你有一个对象,你不知道它是什么,但是你拥有它。如何将二进制数据写入二进制文件以便以后检索?

我最初的想法是我不知道该怎么办:

  1. 以某种方式弄清楚对象的所有成员(可能是反射)
  2. 除非成员属于BinaryWriter可写的类型,否则请在成员
  3. 上重复步骤1
  4. 制作一个标题,说明成员的类型以及它们如何组装到对象中(不知何故)
  5. 写标题
  6. 编写所有核心级别成员
  7. 我不知道如何使用反射,所以我不知道如何做到以上的大部分内容。 但是它应该是可行的。

    如果有可能,我该怎么做?或者我应该如何实现上述内容?

    bin
    

3 个答案:

答案 0 :(得分:1)

最简单的方法是使用BinaryFormatter。但是,如果要加载以前版本的应用程序保存的实例,则应该非常小心对类的任何更改。

答案 1 :(得分:1)

困难的方面不是写出对象,而是回读它们。 .NET框架提供了各种类型的序列化和反序列化技术,这些技术可以自动化该过程,但我熟悉的所有内置技术都有各种限制。

一个主要问题是.NET没有区分保存对象引用的存储位置,以便识别其他代码使用的对象,仅用于此目的识别除了身份之外的对象状态不可变方面,或者用于封装对象的可变状态的目的。在不知道字段应该表示什么的情况下,不可能知道它应该如何序列化或反序列化。例如,假设某个特定类型具有类型int[]的字段,该字段包含对保存值23的单个元素数组的引用。可能该字段的目的是保存值23或者可能是该字段的目的是识别一个数组,其中第一个元素应该在每次发生时递增。在前一种情况下,序列化应该写出这样一个事实:它是一个包含值23的单个元素数组。在后一种情况下,如果序列化完全可行,则需要知道对于数组的重要性。字段有参考。

虽然各种各样的人已经编写了各种方法来自动序列化各种类,但我倾向于对这些事情持怀疑态度。如果一个人不知道一个类的字段用于什么,那么应该谨慎地对由此封装的状态做出任何假设。

答案 2 :(得分:0)

有可能BinaryFormatter。但是想想一个对象结构,你有许多unknown个对象,它们都引用了一个共同的对象。如果序列化所有unknown个对象,则最终会得到与unknown个对象一样多的公共对象副本。

可能有许多unknown对象的字段由于它们是由构造函数或其他类设置而不相关,它们在反序列化时可能处于不一致状态。

因此序列化它们可能并不那么难,但是你想如何反序列化呢?