Как обрабатывать неподдерживаемые типы данных в Aerospike

Известно, что некоторые типы данных, такие как Float, не поддерживаются сервером Aerospike. Но они обрабатываются на стороне клиента. Например, клиент Python версии 1.0.40 поддерживает неподдерживаемые типы данных с помощью сериализации.

Я хотел бы знать, как именно это обрабатывается клиентом при получении данных с сервера. Я имею в виду, как клиент узнает, что корзина должна быть несериализована и отображаться для пользователя.

Это поможет мне обрабатывать извне клиента, если язык клиента, который я использую, не поддерживает эту функцию.

Спасибо.


person Carbonrock    schedule 24.06.2015    source источник


Ответы (2)


Все, кроме стандартных типов данных, будет храниться как большой двоичный объект Python (внутренний тип данных). Механизм сериализации Python используется для генерации байтов. Клиенты Aerospike отправляют тот факт, что он отправляет большой двоичный объект Python. Сервер Aerospike также запоминает этот факт и возвращает информацию обратно при чтении корзины. Это интерпретируется клиентом, и если это тип большого двоичного объекта Python, он запускает байты через десериализатор Python. Это восстановит объект python. Аналогичная вещь делается и в Java и сохраняется как java blob с использованием сериализатора/десериализатора java.

Очевидно, что эти питоновые BLOB-объекты не могут быть прочитаны в Java-клиенте и наоборот. Таким образом, не ожидайте межъязыковой функциональности при использовании неродных типов.

person sunil    schedule 24.06.2015
comment
@ Сунил, спасибо за ценный ответ. Не могли бы вы объяснить, как отправить факт, о котором вы упомянули, на сервер aerospike и, читая обратно, как прочитать факт. Было бы полезно, если бы вы могли объяснить подробно. - Спасибо. - person Carbonrock; 25.06.2015
comment
Может ли кто-нибудь помочь мне с вышеуказанным запросом? Как именно мне нужно справиться с тем фактом, о котором Сунил упомянул выше. - person Carbonrock; 26.06.2015
comment
Вам не нужно ничего делать явно. Драйвер клиента Aerospike обрабатывает это прозрачно. Драйвер клиента имеет открытый исходный код, если вы хотите взглянуть на него. Но я не рекомендую настраивать его слишком сильно. - person sunil; 27.06.2015

Сериализация в клиенте Python более подробно описана в разделе прямо над set_serializer. метод

person Ronen Botzer    schedule 26.06.2015
comment
@ Ронен. Спасибо за ваш ответ. Я прошел через это и не могу получить то, что мне нужно. Мне нужно знать о части десериализации. Как известно, бин нужно десериализовать и вернуть пользователю или вернуть как блоб без десериализации. Может возникнуть ситуация, когда я вставил какой-то блоб и ожидаю вернуть блоб без десериализации. Не могли бы вы подробно объяснить эту область? Спасибо. - person Carbonrock; 26.06.2015
comment
Если вы не устанавливаете свой собственный сериализатор, то массив байтов будет сохранен как as_bytes с кодировкой AS_BYTES_BLOB. Когда вы читаете эту запись (если вы не установили десериализатор), любой AS_BYTES_BLOB снова превратится в массив байтов. Точно так же сериализатор по умолчанию преобразует неподдерживаемые типы в as_bytes с кодировкой AS_BYTES_PYTHON, и когда клиент Python считывает их, он десериализует их обратно в исходный тип Python. Я надеюсь, что это ответит вам. - person Ronen Botzer; 27.06.2015
comment
@ Ронен. Спасибо за ваш ответ. Я думаю, что этот поток был реализован в клиенте C, а клиент python, обернутый вокруг клиента C, этого не знает. Есть ли способ получить тип кодировки, будь то AS_BYTES_BLOB или AS_BYTES_PYTHON из клиента Python? - person Carbonrock; 08.07.2015
comment
Если вы используете встроенную сериализацию на основе cPickle, вы можете полагаться на типы для неявного определения кодировки. Если вы возвращаете массив байтов, это означает, что тип на сервере был as_bytes с кодировкой AS_BYTES_BLOB. Если это любой другой тип, это означает, что это AS_BYTES_PYTHON, что вызовет автоматическую десериализацию. В противном случае нет никакого способа узнать изнутри Python. - person Ronen Botzer; 09.07.2015