1

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

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

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

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

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

bin
4

3 回答 3

1

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

于 2013-06-16T23:57:46.580 回答
1

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

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

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

于 2013-06-17T00:19:50.453 回答
0

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

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

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

于 2013-06-17T00:01:48.460 回答