Двоичный файл из C # в Python

#c# #python

#c# #python

Вопрос:

Как открыть двоичный файл, созданный приложением C #, на Python? Я знаю структуру файла на C #.

Я пытался найти информацию в Интернете, но не смог.

Структура:

 [Serializable]
public class FileClass
{
    public ObservableCollection<Class1> OC1 { get; set; }
    public Class2 C2 { get; set; }
    public Class3 C3 { get; set; }

    public FileClass()
    {
        OC1 = new ObservableCollection<Class1>();
        C2 = new Class2();
        C3 = new Class3();
    }
}

[Serializable]
public class Class1
{
    public string Text { get; set; }

    public Class1()
    {
        Text = String.Empty;
    }
}
  

Class2 и Class3 такие же, как Class1.

Прочитать файл:

     public FileClass DeSerialization()
    {
        FileClass data = new FileClass();

        BinaryFormatter binFormat = new BinaryFormatter();

        using (Stream fStream = new FileStream("test.dat", FileMode.Open, FileAccess.Read, FileShare.None))
        {
            using (GZipStream gzStream = new GZipStream(fStream, CompressionMode.Decompress))
            {
                data = (FileClass)binFormat.Deserialize(gzStream);
                gzStream.Close();
            }

            fStream.Close();
        }

        return data;
    }
}
  

Я знаю, как создать новый двоичный файл на Python, но я не могу перенести файловую структуру из C #.

Как переместить структуру в Python и открыть файл? Если это возможно.

Комментарии:

1. Вероятно, вам придется начать чтение здесь , но на самом деле я бы использовал другой сериализатор (например, ProtoBuf или MessagePack)

2. @John Спасибо, я обязательно это изучу. Насколько я могу понять, мне нужен сериализатор для разных языков. И я не смогу просто перенести структуру. Это тоже не сработает. Я правильно понимаю?

3. В значительной степени. Основы буфера протокола: C # говорит об этом довольно хорошо: «Используйте двоичную сериализацию .NET с System.Runtime.Serialization.Formatters.Binary.BinaryFormatter и связанными классами. В конечном итоге это становится очень хрупким перед лицом изменений, в некоторых случаях дорогостоящим с точки зрения размера данных. Это также не очень хорошо работает, если вам нужно обмениваться данными с приложениями, написанными для других платформ. » (выделено мной)

4. @John, пожалуйста, скажите мне, ProtoBuf или MassagePack являются лучшим решением для моей проблемы? Что вы думаете? Допустим, я написал приложение под Windows, теперь мне нужно переписать на кроссплатформенном фреймворке. И для этого я выбираю Python (Qt). Тогда мне нужен кроссплатформенный и межъязыковой сериализатор. Какое-нибудь правильное приложение на C #, для меня это не проблема. Я хочу оставить C # и использовать кроссплатформенный для этого приложения.

5. Я раньше не использовал ProtoBuf, но это сделано Google, и, похоже, это то, что многие люди используют в настоящее время. MessagePack — это более старый продукт, и я только играл с ним, никогда не использовал его в производстве. Я действительно не могу сказать вам, какой из них лучше, поэтому вам, вероятно, придется оценить их оба (и любые другие существующие варианты).