C# .NET二进制序列化元数据

C# .NET二进制序列化元数据,c#,class,metadata,definition,binary-serialization,C#,Class,Metadata,Definition,Binary Serialization,一周前,我遇到了一种情况,我必须读取由其他人开发的另一个应用程序生成的二进制序列化对象。 我只有someSerializedData.bin文件,因此我尝试手动重新创建未知对象的类定义,并且我能够这样做,因为序列化文件中有元数据。 奇怪的是,我在谷歌上找不到任何工具 Q1:为什么没有从二进制序列化文件/数据重新创建类定义的工具? 这引出了我的第二个问题 Q2:是否存在无法从序列化数据恢复类定义的情况?(假设没有以任何方式对其进行加密或模糊处理,我对涉及“default”.NET Binaryse

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

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

这引出了我的第二个问题


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

在不知道二进制数据中包含什么的情况下,不可能反序列化二进制数据。实现这一点的唯一方法是使用JSON或XML对其进行序列化。 举例说明:

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

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


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


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

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

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

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

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

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

问题2:是否存在无法从序列化数据恢复类定义的情况

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

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


另外,别忘了咨询你的律师。

请不要只是否决,告诉我出了什么问题,这样我可以改进这个问题。我想你要找的是反射(将机器代码反写回C),对吗?你有制作.bin文件的应用程序的副本吗?如果是这样,您可以对其进行反编译并查看代码。请参阅dotPeak:此链接可能对您有所帮助。二进制序列化通常由实现ISerializable的类自定义。例如,许多.NET类都与此相关。您无法从二进制数据恢复。我们讨论的是.NET二进制序列化,而不是自定义序列化。我的问题不是我是否可以反序列化未知对象。(顺便说一句,可能是因为包含元数据-->questions/17996701/无对象定义的二进制反序列化)我的问题是,如果您可以使用Binaryformatter(非自定义!)进行序列化,而无需太多元数据,这将有助于任何人恢复对象的原始类定义。谢谢你的回答:)@Casual我的问题是,如果你能用Binaryformatter(不是定制的!)序列化,而不需要那么多元数据,这将有助于任何人恢复对象的原始类定义,不,你的问题不是这个。。。这不等于无法从序列化数据恢复类定义时出现这种情况吗?string vs int只是一个问题,因为他猜测了类型,而没有读取实际的二进制数据。Athari“别忘了咨询律师”是什么意思P@Casual在许多国家,反编译你不拥有的软件是非法的。我所说的拥有商业软件是指实际拥有,而不是购买一个副本供使用,因为许多EULA不允许反编译。有一些国家,包括澳大利亚和俄罗斯,总是允许为特定目的进行反编译,凌驾于所有EULA之上。我不确定反向工程文件格式和协议。总的来说,如果你不确定,咨询律师是个好主意。另外,是“@”,不是“#”。关于评论的通知总是发送给问题和答案的作者。