Вопрос

Я беру некоторые двоичные данные из своей базы данных MySQL.Он выводится как тип mysqlpp::sql_blob.

Так уж получилось, что этот большой двоичный объект является сериализованным Google Protobuf.Мне нужно десериализовать его, чтобы я мог получить к нему обычный доступ.

Это приводит к ошибке компиляции, поскольку ParseFromString() не предназначен для типов mysqlpp:sql_blob:

protobuf.ParseFromString( record.data );

Однако, если я принудительно выполню приведение, оно скомпилируется нормально:

protobuf.ParseFromString( (std::string) record.data );

Это безопасно?Я особенно беспокоюсь из-за этого фрагмента из документации mysqlpp:

"Поскольку строки C ++ отлично обрабатывают двоичные данные, вы можете подумать, что можете использовать std::string вместо sql_blob , но текущая конструкция String преобразуется в std ::string через строку C.В результате данные большого двоичного объекта усекаются по первому встроенному нулевому символу во время заполнения SSQLS.Это невозможно исправить без полной перестройки String или механизма SSQLS ".

Спасибо за вашу помощь!

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top