Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何序列化结构并将其存储在MySQL数据库中? 我使用C++作为一个在线游戏服务器项目,我需要在MySQL数据库中存储一些结构作为二进制BLUB。我正在使用RakNet进行联网,并尝试使用其BitStream类序列化数据,但我不知道如何正确操作。我的问题是,如何将一个结构转换成一个字节流,然后通过insert/update查询将其传递到MySQL数据库blob中?我正在使用MySQL服务器下载附带的MySQL C库。_C++_Mysql_Struct_Serialization - Fatal编程技术网

如何序列化结构并将其存储在MySQL数据库中? 我使用C++作为一个在线游戏服务器项目,我需要在MySQL数据库中存储一些结构作为二进制BLUB。我正在使用RakNet进行联网,并尝试使用其BitStream类序列化数据,但我不知道如何正确操作。我的问题是,如何将一个结构转换成一个字节流,然后通过insert/update查询将其传递到MySQL数据库blob中?我正在使用MySQL服务器下载附带的MySQL C库。

如何序列化结构并将其存储在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

如果结构中没有指针,可以直接将其存储为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, sizeof(MyStruct)); 
    queryLen = snprintf(query, sizeof(query), 
                       "INSERT INTO my_table (id, blobdata) VALUES (NULL, '%s')",
                       myDataEscaped);

    mysql_real_query(conn, query, queryLen);
}

如果您的结构中有指针(指向其他结构或字符串),那么您必须单独拉出每个字段并对其进行序列化,或者创建一个没有指针的新结构来存储数据(只是不要存储指针值本身,因为在反序列化数据时它们将毫无意义)。有些可能会有所帮助 首选方法是分别写入每个字段,最好是以人类可读的形式,如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*)?这是完全可能的,我没有通过编译器运行它。(我的答案是从中得到启发的)。