6

一周前,我遇到了一种情况,我必须读取由其他人制作的另一个应用程序制作的二进制序列化对象。我只有 someSerializedData.bin 文件,所以我尝试手动重新创建未知对象的类定义,并且我能够这样做,因为序列化文件中的元数据。奇怪的是,我在谷歌上找不到任何工具。

Q1:为什么没有从二进制序列化文件/数据重新创建类定义的工具?

这引出了我的第二个问题

Q2:是否存在无法从序列化数据中恢复类定义的情况?(假设它没有以任何方式加密或混淆,我对涉及“默认”.NET Binaryserializer 属性的情况感兴趣,以禁用包含的类型信息和元数据)

4

4 回答 4

2

在不知道其中内容的情况下,不可能反序列化二进制数据。做到这一点的唯一方法是使用 JSON 或 XML 对其进行序列化。一个例子来说明:

你的名字“Casual”可以这样序列化:67,97,115,117,97,108。如果您没有注意到:这是使用 ASCII 编码完成的(如果我没有犯任何错误)。所以现在,假设你不知道这是用 ASCII 完成的,谁说这不仅仅是一个带有数字的数组?还是 2 个数字的 3 个数组?或者一个 ID 为 67 的对象和一个 ID 为 117 的对象。没人知道,所以你的任务是不可能的。

唯一的选择是与最初序列化它的人沟通,并询问他/她这是如何完成的以及在这个二进制对象中序列化了哪些对象。

亲切的问候

于 2013-08-15T10:34:27.183 回答
2

Q1:为什么没有从二进制序列化文件/数据重新创建类定义的工具?

我的猜测是很少有人需要这个。首先,二进制序列化不如 XML、JSON 和其他标准化且几乎在任何地方都受支持的格式流行。

没有关于二进制格式的文档。需要深入研究 .NET Framework 源代码才能理解它。这不好玩。

Q2:是否存在无法从序列化数据中恢复类定义的情况?

看起来二进制格式包含足够的数据。如果您绝对需要一个工具来从序列化文件中对原始类及其字段进行逆向工程,您可以从读取mscorlib 和其他类的System.Runtime.Serialization.Formatters.Binary.BinaryFormatter源代码开始。System.Runtime.Serialization.Formatters.Binary.ObjectReader

但是,如果生成文件的应用程序没有被混淆,我建议先尝试反编译它。这可能会容易得多。

PS 不要忘记咨询你的律师。

于 2013-09-03T14:02:29.197 回答
1

没有工具存在的原因是因为创建仅包含数据的类型通常是不够的。这些方法通常与数据一样重要,尤其是对于不只是设置其私有变量的属性。没有人知道这些方法是什么。

话虽如此,拥有一个至少能够生成一种类型来保存数据的工具可能会很有用。也许您会是第一个创建这样一个工具的人?

于 2013-09-02T22:43:29.500 回答
1

我不确定元数据中是否有足够的信息来重新创建该类型。想象一下复杂的(如嵌套的)对象图。在您之前的问题中,成员类型(String vs int)一直是个问题。

关于您的第二个问题,我不确定您要达到什么目标。我不确定您是否可以使用 BinaryFormatter 以不太容易进行逆向工程的方式输出数据,但其他方法应该易于实现。

于 2013-09-03T06:20:38.760 回答