.NET二进制序列化元数据

时间:2013-08-14 17:34:25

标签: c# class metadata definition binary-serialization

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

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

这导致了我的第二个问题

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

4 个答案:

答案 0 :(得分:2)

如果不知道二进制数据中的内容,就无法对二进制数据进行反序列化。唯一的方法是使用JSON或XML序列化它。 举例说明:

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

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

亲切的问候

答案 1 :(得分:2)

  

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

我的猜测是很少有人需要这个。首先,二进制序列化并不像XML,JSON和其他格式那样受欢迎,这些格式是标准化的,几乎可以在任何地方支持。

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

  

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

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

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

P.S。不要忘记咨询你的律师。

答案 2 :(得分:1)

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

有了这个说法,拥有一个至少能够生成一个类型来保存数据的工具可能会很有用。也许你会成为第一个创造这样一个工具的人?

答案 3 :(得分:1)

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

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