Как вы сериализуете структуру и храните ее в базе данных MySQL? - PullRequest
1 голос
/ 08 сентября 2010

Я использую C ++ для проекта сервера онлайн-игр, и мне нужно хранить некоторые структуры в виде двоичных объектов в базе данных MySQL.Я использую RakNet для работы в сети и пытался использовать его класс BitStream для сериализации данных, но я не знаю, как это сделать правильно.Мой вопрос заключается в том, как превратить структуру в поток байтов, которые можно передать в большой двоичный объект базы данных MySQL с помощью запроса вставки / обновления?Я использую библиотеки MySQL C, которые поставляются с сервером MySQL.

Ответы [ 2 ]

1 голос
/ 08 сентября 2010

Во-первых, я не предлагаю сериализацию структур C ++. Компилятору разрешено вставлять заполнение между членами, и существуют другие проблемы, такие как Endianness и битовая ширина типов.

Предпочтительным способом является запись каждого поля отдельно, предпочтительно в удобочитаемой для человека форме, такой как ASCII или Unicode. Это позволяет добавлять, удалять или изменять поля в будущем с минимальными изменениями в базе данных.

При этом данные отправляются в базу данных MySQL с помощью запроса. Я предлагаю, чтобы каждый класс поддерживал методы для получения своего типа данных и атрибутов SQL и его значения SQL в виде строки. Это сделает ввод-вывод базы данных более общим.

Я использую библиотеки C ++, которые поставляются вместе с MySQL. Я предлагаю вам использовать их также, так как вы используете C ++.

Я разработал пакет базы данных для использования шаблона проектирования Visitor. Одним из посетителей является объект, который пишет в базу данных.

Большие двоичные объекты (BLOB) лучше всего вставлять с использованием подготовленного оператора. См .: Подготовленный оператор MySql Connector передает только 64 байта

1 голос
/ 08 сентября 2010

Если в вашей структуре нет указателей, вы можете сохранить ее как большой двоичный объект, например:

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);
}

Если в вашей структуре есть указатели (на другие структуры или на строки), тогдавам придется извлекать каждое поле отдельно и сериализовать его или создавать новую структуру без указателей для хранения данных (только не храните сами значения указателей, поскольку они будут бессмысленными при десериализации данных).Здесь упоминаются некоторые библиотеки , которые могут помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...