【问题标题】:Is there a way to read C# serialized objects into Python?有没有办法将 C# 序列化对象读入 Python?
【发布时间】:2013-01-10 06:06:06
【问题描述】:

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

【问题讨论】:

  • 新反序列化的对象会是什么样子?您只是想要某种财产包或键/值集合吗?原始物体是什么样子的? XML 是什么样的?
  • 将对象序列化为 XML 有问题吗?二进制序列化对于异构环境来说是一个糟糕的选择。
  • @Dennis:他想将 XML 反序列化为不同语言的对象。
  • @RobertHarvey:奥利? “我有一个二进制文件”。
  • @Dennis:如果真的是二进制序列化,那估计没救了。

标签: c# python deserialization


【解决方案1】:

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

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

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

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

【讨论】:

  • 我使用的是 Python 2.7.1,这看起来是一个非常好的解决方案——值得一试
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如上所述,您可以使用 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()
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-02-10
        • 2017-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        相关资源
        最近更新 更多