如何在C#中以二进制格式获取对象的元数据信息?

时间:2012-09-05 09:51:01

标签: c# .net

我正从我在Python中运行的应用程序中收到二进制流。

从二进制流中,我想在字节数组中创建一个C#对象。

如何反序列化对象并从二进制流中检索对象?

我们可以忽略它是一个python应用程序。我对二进制流的工作方式更感兴趣。

3 个答案:

答案 0 :(得分:2)

您似乎认为所有语言都会自动使用相同的序列化方案。

  • 事实并非如此。

  • 理论上甚至不可能,因为不同的编程语言对于作为对象的含义有不同的概念。

如果您对如何在C#中读取Python序列化流特别感兴趣,那就问一下。否则,这个问题是无法回答的,因为它是基于错误的前提。


关注 - 出于好奇,我在C#中搜索了一个Python pickle阅读器。搜索结果的前3页中没有任何内容......虽然在C ++中有对pickle reader的引用。

答案 1 :(得分:0)

  

C#对象

C#没有对象;它是一个.Net对象。

其次,我们绝对不能忽视它是一个Python应用程序,因为这意味着它可能不会在.Net上运行,因此.Net二进制格式不是Python运行时的本机格式。这并不是说在这种情况下,.Net序列化不可能可能,因为如果你正在运行IronPython - the .Net python implementation - 那么你可以简单地使用二进制序列化API从中获取并获取序列化的 .Net对象

但是,如果它是在不同平台上运行的Python,那么你可以解码二进制流中的信息,因为你需要知道格式,然后直接进入马的口并阅读{{ 3}}

这当然需要(相当多)更多的工作!

如果您正在处理的项目允许您更改原始对象的序列化方式,那么我强烈建议您切换到XML序列化或类似的东西 - 这是可移植的。

答案 2 :(得分:0)

只是为您添加一些一般信息:

在C#/ .Net中,有一种将对象序列化为非二进制形式的通用方法,因为二进制形式需要许多类似协议的标题 - 注意 - 包含元数据,这会导致接收者必须知道.Net / CLR内部结构非常好。

相反,今天,对象通常被序列化为XML(当类型信息至关重要时)或JSON格式(仅当数据很重要时),以便任何接收者可以非常容易地读取它们,并且更经常地 - 任何第三方都可以轻松地读取它们生成新的类似对象的数据,我们的应用程序可能“只是反序列化”,无论是谁生成它以及在什么平台上。

但是,仍然使用二进制序列化。即使压缩,XML / JSON数据通常仍然大于二进制图像。但是,当我们希望将数据不发布到外部世界时,或者如果我们以某种方式神奇地知道它只会被处理时,严格使用二进制序列化。使用我们的程序集的网络。