如何在Python中反序列化序列化的C#二进制文件?

我想反序列化Visual Studio 2017中用C#制作的二进制文件。

一个程序(C#)对structs不同类型的arrays进行序列化,另一个程序(C#)对文件进行反序列化。我想知道如何在Python中完成相同的工作。

// ClassTickStruct.dll
namespace ClassTickStruct
{
    [Serializable]
    public struct struct_tick
    {
        public uint[] arr_currentIndex;
        public string[] arr_currentType;
        public DateTime[] arr_currentTime;
 
        public struct_tick(byte size_index,byte size_type,byte size_time)
        {
            arr_currentIndex = new uint[size_index];
            arr_currentType = new string[size_type];
            arr_currentTime = new DateTime[size_time];
        }
    }
}
// How one program(C#) serializes structs
using (var fileStream = new FileStream(file.bin,FileMode.Append))
{
    var bFormatter = new BinaryFormatter();

    bFormatter.Serialize(fileStream,obj_struct);
}
// How the other program(C#) deserializes the file
List<struct_tick> list_read = new List<struct_tick>();
using (var fileStream = new FileStream("file.bin",FileMode.Open))
{
    var bFormatter = new BinaryFormatter();
    //bFormatter.Binder = new AllowAllAssemblyVersionsDeserializationBinder();

    while (fileStream.Position != fileStream.Length)
    {
        list_read.Add((struct_tick)bFormatter.Deserialize(fileStream));
    }
}

我参考了Is there a way to read C# serialized objects into Python?并尝试了DirtyLittleHelper的代码,但是发生了一条错误消息:

    data = serializer.Deserialize(reader)
System.Runtime.Serialization.SerializationException: 'tickReceiver,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' Assembly can't be found
   location: System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.Getassembly()
   location: System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo,String name)
   location: System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectname,String[] memberNames,BinaryTypeEnum[] binaryTypeEnumA,Object[] typeInformationA,Int32[] memberAssemIds,ObjectReader objectReader,Int32 objectId,BinaryAssemblyInfo assemblyInfo,SizedArray assemIdToAssemblyTable)
   location: System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
   location: System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
   location: System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
   location: System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler,__BinaryParser serParser,Boolean fCheck,Boolean isCrossAppDomain,IMethodCallMessage methodCallMessage)
   location: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream,HeaderHandler handler,IMethodCallMessage methodCallMessage)
   location: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)

当C#程序不共享结构的dll时,我遇到了同样的Assembly can't be found错误。然后,我只创建了一个具有该结构的类库(dll),并使程序引用了它,并且它们可以正常工作而不会出现错误。

# the whole Python code to deserialize the file
import clr
import System
#requires pythonnet installed -> pip install pythonnet 
clr.AddReference(r"C:\Users\null\Desktop\RECEIVER\ClassTickStruct.dll")

from System.Runtime.Serialization.Formatters.Binary import BinaryFormatter
from System.IO import FileStream,FileMode,Fileaccess,FileShare

filepath = "file.bin"
serializer = BinaryFormatter()
reader = FileStream(filepath,FileMode.Open,Fileaccess.Read)
data = serializer.Deserialize(reader)

我认为不同的是C#中的(struct_tick)bFormatter.Deserialize(fileStream)和Python中的serializer.Deserialize(reader)。也许它需要处理dll中的结构吗?

tanglc321 回答:如何在Python中反序列化序列化的C#二进制文件?

protobuf实际上可以实现我想做的事情。

// WRITE
using (var fileStream = new FileStream("file.bin",FileMode.Append))
{
    Serializer.Serialize(fileStream,OBJ_struct);
}

// READ
using (var fileStream = new FileStream("file.bin",FileMode.Open))
{
    struct_obj str = Serializer.Deserialize<struct_obj >(fileStream);

    for (int num=0;  num < str.arr_currentIndex.Length; num++)
    {
        listBox1.Items.Add(str.arr_currentIndex[num]);
    }

}

谢谢那些推荐protobuf的人!

本文链接:https://www.f2er.com/3119376.html

大家都在问