【问题标题】:How to write an object of unknown type to a binary file?如何将未知类型的对象写入二进制文件?
【发布时间】:2013-06-16 23:50:27
【问题描述】:

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

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

  1. 以某种方式找出对象的所有成员(可能是反射)
  2. 除非成员是 BinaryWriter 可写的类型,否则对成员重复步骤 1
  3. 制作一个标头,说明成员的类型以及它们如何组装到对象中(以某种方式)
  4. 写标题
  5. 写出所有核心级别的成员

我不太了解如何使用反射,所以我不确定如何执行上述大部分操作。 不过应该还是可以的。

如果可能的话,我应该怎么做?或者我应该如何实现上述?

bin

【问题讨论】:

    标签: c# binary binarywriter


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      虽然很多人编写了各种方法来自动序列化各种类,但我倾向于对这些事情持怀疑态度。如果不知道类的字段用于什么,则应该谨慎地对其封装的状态进行任何假设。

      【讨论】:

        【解决方案3】:

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

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

        所以序列化它们可能并不难,但你想如何反序列化它们?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-08
          • 2015-07-09
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          • 1970-01-01
          • 2018-12-08
          相关资源
          最近更新 更多