我正在从我在 Python 中运行的应用程序接收二进制流。
从二进制流中,我想在字节数组的流中创建一个 C# 对象。
如何反序列化对象并从二进制流中检索对象?
我们可以忽略它是一个 python 应用程序。我对二进制流的工作原理更感兴趣。
您似乎认为所有语言都会自动使用相同的序列化方案。
事实并非如此。
这在理论上甚至是不可能的,因为不同的编程语言对对象的含义有不同的概念。
如果您对如何在 C# 中读取 Python 序列化流特别感兴趣,请询问。否则,这个问题是无法回答的,因为它是基于一个错误的前提。
跟进- 出于好奇,我在 C# 中搜索了一个 Python pickle reader。搜索结果的前 3 页中没有任何内容……尽管在 C++ 中提到了一个泡菜阅读器。
C# 对象
C# 没有对象;这是一个 .Net 对象。
其次,我们绝对不能忽略它是一个 Python 应用程序,因为这意味着它很可能没有在 .Net 上运行,因此 .Net 二进制格式不是 Python 运行时的原生格式。这并不是说在这种情况下您无法使用 .Net 序列化,因为如果您正在运行IronPython(.Net python 实现),那么您可以简单地使用其中的二进制序列化 API 并获得被序列化的.Net 对象。
但是,如果它是运行在不同平台上的 Python,那么您可以对二进制流中的信息进行解码,为此您需要知道格式,然后直接上门阅读二进制格式数据结构规范来自 MSDN。
当然,这将需要(相当多)更多的工作!
如果您正在处理的项目允许您更改原始对象的序列化方式,那么我强烈建议您切换到 XML 序列化或类似的东西 - 设计为可移植的。
只是为您添加一些一般信息:
在 C#/.Net 中,有一种将对象序列化为非二进制形式的通用方法,因为二进制形式需要许多类似协议的标头来 - 注意 - 包括元数据,这导致接收者必须知道 .Net /CLR 内部结构很好。
相反,今天,对象通常被序列化为 XML(当类型信息很重要时)或 JSON 格式(当只有数据重要时),因此任何接收者都可以很容易地读取它们,而且更频繁地 - 任何第 3 方都可以轻松地生成新对象- 类似于我们的应用程序可能“只是反序列化”的数据,而不管它是谁生成的以及在什么平台上生成的。
但是,仍然使用二进制序列化。XML/JSON 数据,即使经过压缩,通常仍然比二进制图像大。但是,当我们不希望将数据发布到外部世界时,或者如果我们以某种方式神奇地知道它将仅在 .Net 上使用我们的程序集进行处理,则严格使用二进制序列化。