Обрабатывать объект Python pickle bytes в C#

#c# #python.net

#c# #python.net

Вопрос:

Использование Pythonnet в приложении C #:

Python возвращает bytes ({<class 'bytes'>}) объект, который является результатом pickle.dumps операции.

Каков наилучший способ работы с этим объектом в C # с точки зрения сохранения в хранилище больших двоичных объектов и регидратации bytes объекта для передачи обратно в Python на более позднем этапе?

Ответ №1:

Предполагая, что у вас есть доступ к части уравнения на языке Python, самый простой способ справиться с такого рода проблемами — это сериализовать объект в каком-то взаимно понятном формате.

В этом случае одной из идей было бы сериализовать байты в base64 (в юникоде, таком как UTF-8 или -16, могут возникнуть проблемы с кодировкой в зависимости от содержимого байтовой строки). Затем вы могли бы преобразовать эти байты base64 в UTF-8, чтобы передавать их обратно между программами.

Это выглядит как (например):

 base64.b64encode(pickle.dumps("Some data goes here")).decode("utf-8")
  

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

1. Хотя этот способ работает хорошо, он не самый эффективный. Должен быть более прямой способ скопировать байты непосредственно в C # byte[].

2. Конечно, возможны тонны оптимизаций. Вы всегда можете передавать байты потоком через сокет или передавать по паре (адрес памяти, длина данных), например. Однако я сомневаюсь, что это будет узким местом большинства программ. Я бы убедился, что это действительно узкое место, прежде чем прибегать к более сложному подходу.