.NET二进制序列化元数据



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

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

这引出了我的第二个问题

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

如果不知道二进制数据中包含什么,就不可能对其进行反序列化。唯一的方法是使用JSON或XML对其进行序列化。举例说明:

你的名字"休闲"可以这样连载:67,97115117,97108。如果你没有注意到:这是使用ASCII编码完成的(如果我没有犯任何错误的话)。现在,想象一下,你不知道这是用ASCII完成的,谁说这不仅仅是一个有数字的数组?还是2个数字的3个数组?或者ID为67的对象和ID为117的对象。没有人知道,所以你的任务是不可能的。

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

亲切问候

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

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

没有关于二进制格式的文档。人们需要深入研究.NET Framework的来源才能理解它。这并不有趣。

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

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

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

附言:别忘了咨询你的律师。

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

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

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

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

最新更新