如何序列化结构并将其存储在MySQL数据库中? 我使用C++作为一个在线游戏服务器项目,我需要在MySQL数据库中存储一些结构作为二进制BLUB。我正在使用RakNet进行联网,并尝试使用其BitStream类序列化数据,但我不知道如何正确操作。我的问题是,如何将一个结构转换成一个字节流,然后通过insert/update查询将其传递到MySQL数据库blob中?我正在使用MySQL服务器下载附带的MySQL C库。
如果结构中没有指针,可以直接将其存储为blob,例如:如何序列化结构并将其存储在MySQL数据库中? 我使用C++作为一个在线游戏服务器项目,我需要在MySQL数据库中存储一些结构作为二进制BLUB。我正在使用RakNet进行联网,并尝试使用其BitStream类序列化数据,但我不知道如何正确操作。我的问题是,如何将一个结构转换成一个字节流,然后通过insert/update查询将其传递到MySQL数据库blob中?我正在使用MySQL服务器下载附带的MySQL C库。,c++,mysql,struct,serialization,C++,Mysql,Struct,Serialization,如果结构中没有指针,可以直接将其存储为blob,例如: void insertBlob(MYSQL *conn, MyStruct *myData) { char myDataEscaped[2 * sizeof(MyStruct) + 1]; char query[100 + 2 * sizeof(MyStruct) + 1]; int queryLen; mysql_real_escape_string(conn, myDataEscaped, myData
void insertBlob(MYSQL *conn, MyStruct *myData)
{
char myDataEscaped[2 * sizeof(MyStruct) + 1];
char query[100 + 2 * sizeof(MyStruct) + 1];
int queryLen;
mysql_real_escape_string(conn, myDataEscaped, myData, sizeof(MyStruct));
queryLen = snprintf(query, sizeof(query),
"INSERT INTO my_table (id, blobdata) VALUES (NULL, '%s')",
myDataEscaped);
mysql_real_query(conn, query, queryLen);
}
如果您的结构中有指针(指向其他结构或字符串),那么您必须单独拉出每个字段并对其进行序列化,或者创建一个没有指针的新结构来存储数据(只是不要存储指针值本身,因为在反序列化数据时它们将毫无意义)。有些可能会有所帮助首先,我不建议序列化C++结构。允许编译器在成员之间插入填充,还有其他问题,例如类型的Endianness和位宽度 首选方法是分别写入每个字段,最好是以人类可读的形式,如ASCII或Unicode。这允许在将来添加、删除或更改字段,而对数据库的更改最少 也就是说,使用查询将数据发送到MySQL数据库。我建议每个类都支持获取其SQL数据类型和属性以及作为字符串的SQL值的方法。这将使数据库I/O更加通用 我使用的是随MySQL下载的C++库。我建议你也使用它们,因为你使用C++。 我已经设计了使用Visitor设计模式的数据库包。其中一个访问者是写入数据库的对象
二进制大对象(BLOB)最好使用预先准备好的语句插入。请参阅:为什么要这样做?数据库表中的一列可以存储结构中某个字段的值。我正在为我的游戏服务器试验一个“动作”系统,其中一个实体可以有一个名为“可用”的组件,该组件链接到一个“动作”。我希望动作的类型和参数在一个表中,参数为blob,因为每个动作的参数都不同。虽然这可能不是一个好方法,但正如我所说的,我正在试验,我喜欢尝试并从中学习。我会将每个字段单独序列化,将每个字段转换为(char*)并将它们连接在一起吗?顺便说一句,这里不要提
char*
,这会让人不安。改用std::string
。我的字段类返回一个std::string
作为它们的值,因此我可以将其放入SQL语句字符串中。“myData”变量是否应该在mysql\u real\u escape\u string函数中转换为(char*)?这是完全可能的,我没有通过编译器运行它。(我的答案是从中得到启发的)。