unsigned char *sqlite3_serialize( sqlite3 *db, /* The database connection */ const char *zSchema, /* Which DB to serialize. ex: "main", "temp", ... */ sqlite3_int64 *piSize, /* Write size of the DB here, if not NULL */ unsigned int mFlags /* Zero or more SQLITE_SERIALIZE_* flags */ );
sqlite3_serialize(D,S,P,F) 接口返回一个指向内存的指针,该内存是 数据库连接 D 上 S 数据库的序列化。如果 P 不是 NULL 指针,则数据库的大小(以字节为单位)将写入 *P 中。
对于普通的磁盘数据库文件,序列化只是磁盘文件的副本。对于内存数据库或“TEMP”数据库,序列化是与将该数据库备份到磁盘时写入磁盘的字节序列相同的序列。
通常情况下,sqlite3_serialize() 会将数据库的序列化复制到从 sqlite3_malloc64() 获得的内存中,并返回指向该内存的指针。调用者负责释放返回的值以避免内存泄漏。但是,如果 F 参数包含 SQLITE_SERIALIZE_NOCOPY 位,则不会进行内存分配,并且 sqlite3_serialize() 函数将返回指向 SQLite 当前用于该数据库的数据库的连续内存表示的指针,或者如果不存在此类连续内存表示,则返回 NULL。数据库的连续内存表示通常只在先前调用了 sqlite3_deserialize(D,S,...) 并且 D 和 S 的值相同的情况下才会存在。即使设置了 SQLITE_SERIALIZE_NOCOPY 位但不存在数据库的连续副本,也会将数据库的大小写入 *P 中。
调用后,如果设置了 SQLITE_SERIALIZE_NOCOPY 位,则返回的缓冲区内容将在下一次对连接的写入操作或连接关闭之前保持可访问和不变,并且应用程序不得修改缓冲区。如果该位已清除,则 SQLite 在调用后不会访问返回的缓冲区。
如果发生内存分配错误,即使从参数 F 中省略了 SQLITE_SERIALIZE_NOCOPY 位,sqlite3_serialize(D,S,P,F) 的调用也可能返回 NULL。
如果 SQLite 使用 SQLITE_OMIT_DESERIALIZE 选项进行编译,则会省略此接口。