有没有办法将c#序列化的对象读入Python ?

本文关键字:对象 Python 序列化 有没有 | 更新日期: 2023-09-27 17:51:21

我有一个包含c#序列化对象的二进制文件。

我可以用python读取内容,但得到的结果类似:

'T'x00'x00'x00Test.Jobs.GenerateJobRequest, POC.Server'xca'x02-'xa2'x02't'x82'x01'x06'x1a'x04myahR'x1d'x08'xfe'xff'xff'xff'xff'xff'xff'xff'xff'x01'x12'x10Data Lite Exportp't'n'x16Do_Ko_Change-Job__ID_23'x10'x0c'x18'xa7'xb9'x18('x012'x00:'x00H'xbc'x08')

在python中有反序列化这个对象的方法吗?

我同意这不是一个最佳的解决方案,JSON, XML会更好。但是,我不能控制序列化数据的进程,我只是消费者。

有没有办法将c#序列化的对象读入Python ?

从你的问题来看,不清楚你使用的是哪个版本的Python (CPython, Jython, IronPython)。但我假设你正在使用CPython,对于IronPython来说,这将是微不足道的。

有一个CPython库,Python . net。它作为。net和Python之间的绑定,并且工作得非常好。甚至支持泛型。虽然它似乎不再受到积极的支持,但我已经使用它一段时间了。

你需要Visual Studio来编译它,但它可能会与Visual Studio Express一起工作(尽管我不知道)。

有了这个,你可以导入任何。net . dll。假设您可以在c#中反序列化它,那么您也应该能够在Python中反序列化它。

没有二进制序列化数据的官方文档格式。我找到的最接近的是http://primates.ximian.com/~lluis/dist/binary_serialization_format.htm。因此,获得第三方Python包来为您完成这些工作的可能性很小。即使有,将来也有可能破裂。

如果你想坚持二进制序列化,你最好的选择是使用IronPython并依赖CLR来序列化数据。

否则,对于CLR之外的互操作性,使用SOAP或XML序列化。

如上所述,您可以使用pythonnet和clr。它不再是真正的Python了,但它应该能得到你想要的东西…

import clr
import System
#requires pythonnet installed -> pip install pythonnet 
clr.AddReference("YourDLLAssemblyName") # usually requires dll to be within directory
from System.Runtime.Serialization.Formatters.Binary import BinaryFormatter
from System.IO import FileStream,FileMode,FileAccess,FileShare
filepath = '<PathToYourDataFile>'
serializer = BinaryFormatter()
reader = FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.None)
data = serializer.Deserialize(reader)
print(data, data.GetType())
#from here on you can propably go on via reflection or try to cast it
reader.Close()

No。在任何合理的时间范围内,都不可能按你想要的方式完成。

您需要将其反序列化为XML,然后使用类似这样的代码将其转换为python列表/映射。