【发布时间】:2012-09-24 21:10:57
【问题描述】:
我在 stl 容器(向量)中有数据。向量中的每个节点都是一个结构,其中也包含 stl 字符串。
struct record
{
string name;
string location;
int salary;
}
vector< record > employees;
我想对员工进行序列化,但我也想在序列化之前对其进行加密。
我的加密函数是这样的:
Encode(const char * inBfr, const int in_size, char ** outBfr, int& out_size )
通过搜索,stl 标准似乎不需要我的结构的内存是连续的,所以我不能只获取 employees 变量的内存。有没有其他智能方法可以将此编码功能与基于 stl 的结构/容器一起使用? Encode 函数在普通的 char * 缓冲区中工作对我有好处,所以我确切地知道进出什么,但 stl 结构不是,我正在努力寻找一种好方法,以便我可以将 stl 与这个函数一起使用。
如果有帮助,我也愿意使用任何其他 stl 容器。
【问题讨论】:
-
std::vector的内存必须是连续的(所以你可以使用&employees[0],或者用C++11,employees.data())。但是,结构的布局可能包括填充,这取决于编译器的突发奇想。假设您以后需要能够反序列化,那么依赖结构的布局可能是个坏主意。 -
Encode函数看起来是个糟糕的主意。**表示您可能做错了什么。 -
@KevinBallard 我在之前的评论中说了同样的话,然后意识到这行不通,因为
std::string(存在于每条记录中)只包含指向数据的指针(忘记 SSO),所以你不能简单地对向量的底层缓冲区进行操作。 -
@MooingDuck ** 有什么问题?它只是意味着该函数正在分配所需的任何内存,并且大小在 out_size 变量中给出。我认为这没有任何问题。
-
@zadane:这意味着您可能有内存泄漏。 “正确”的 C++ 可能是
std::vector<char>&,或者根本不传入 outbuffer 参数。
标签: c++ serialization encryption stl