2009-10-09 4 views
0

Я извлекаю некоторые двоичные данные из своей базы данных MySQL. Он выводится как тип mysqlpp :: sql_blob.Можно ли конвертировать mysqlpp :: sql_blob в std :: string?

Как раз так бывает, что этот BLOB является сериализованным Google Protobuf. Мне нужно де-сериализовать его, чтобы я мог нормально обращаться к нему.

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

protobuf.ParseFromString(record.data); 

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

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

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

"Because C++ strings handle binary data just fine, you might think you can use std::string instead of sql_blob, but the current design of String converts to std::string via a C string. As a result, the BLOB data is truncated at the first embedded null character during population of the SSQLS. There’s no way to fix that without completely redesigning either String or the SSQLS mechanism."

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

ответ

1

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

+0

В основном, это зависит от того, как вы сериализовали protobuf. Если вы сериализовали его как двоичный, следите! Вы настраиваете себя на проблему по дороге. Но если вы используете функции google :: protobuf :: TextFormat :: PrintToString() и ParseFromString(), с вами все будет в порядке. – Runcible