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

时间:2013-01-10 06:06:06

标签: c# python deserialization

我有一个包含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 个答案:

答案 0 :(得分:2)

从您的问题来看,目前还不清楚您使用的是哪个版本的Python(CPython,Jython,IronPython)。但我认为你正在使用CPython,对于IronPython而言,这将是微不足道的。

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

你需要Visual Studio来编译它,但它可能适用于Visual Studio Express(虽然我不知道)。

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

答案 1 :(得分:1)

二进制序列化数据没有官方记录格式。我遇到的最接近的是http://primates.ximian.com/~lluis/dist/binary_serialization_format.htm。因此,获得第三方Python软件包的可能性很小。即使它确实如此,它可能会在未来中断。

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

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

答案 2 :(得分: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()

答案 3 :(得分:0)

没有。在任何合理的时间范围内,它都无法以您想要的方式完成。

您需要将其反序列化为XML,然后使用this之类的内容将其转换为python列表/地图。