5

我有一个包含 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 会更好。但是,我无法控制序列化数据的过程,我只是消费者。

4

4 回答 4

2

从您的问题来看,尚不清楚您使用的是哪个版本的 Python(CPython、Jython、IronPython)。但我假设您使用的是 CPython,至于 IronPython,这将是微不足道的。

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

您将需要 Visual Studio 来编译它,但它可能会与 Visual Studio Express 一起使用(尽管我不知道)。

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

于 2013-01-10T06:37:10.247 回答
1

二进制序列化数据没有官方文档格式。我遇到的最接近的是http://primates.ximian.com/~lluis/dist/binary_serialization_format.htm。因此,几乎不可能获得可以为您执行此操作的第三方 Python 包。即使是这样,它也可能在未来破裂。

如果您想坚持使用二进制序列化,最好的办法是使用 IronPython 并依靠 CLR 来序列化数据。

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

于 2013-01-10T06:15:34.670 回答
1

如上所述,您可以使用 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()
于 2017-03-08T11:50:52.943 回答
0

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

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

于 2013-01-10T06:11:34.580 回答