我正在尝试序列化包含许多成员的结构,包括几个Unicode文本字符串(wchar_t,编码为Windows TCHAR),以便稍后保存到文件中。我想将它序列化为一个单元,而不是单独编写结构的各个成员,因为有许多不同的结构需要保存(每个结构都有自己的序列化函数),我希望能够通过一个struct,一旦序列化,就会生成一个泛型函数,在将它实际写入文件之前用一些元数据包装它(并将它添加到我正在创建的附带索引中)。
然而,虽然整数序列化和反序列化很好,但字符串一旦被反序列化,就会显示为基本上随机的文本(每次更改)。
这是我的序列化功能:
PBYTE SerializeLanguage(language *Language){
PBYTE SerializedLanguage;
SIZE_T LanguageLen;
UINT CurrentIndex = 0;
LanguageLen = GetSerializedLanguageLength(Language);
SerializedLanguage = (PBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, LanguageLen);
CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name_length), sizeof(Language->name_length));
CurrentIndex += sizeof(Language->name_length);
CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name), (lstrlen(Language->name) + 1) * sizeof(TCHAR));
return SerializedLanguage;
}
我的反序列化功能:
VOID DeserializeLanguage(language *Out, PBYTE SerializedLanguage){
UINT CurrentIndex = 0;
CopyMemory(&(Out->name_length), &SerializedLanguage[CurrentIndex], sizeof(Out->name_length));
CurrentIndex += sizeof(Out->name_length);
Out->name = (PTCHAR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Out->name_length);
CopyMemory(Out->name, &SerializedLanguage[CurrentIndex], Out->name_length);
MessageBox(NULL, Out->name, NULL, MB_OK);
return;
}
最后,语言结构:
typedef struct language {
UINT name_length;
PTCHAR name;
UINT script_name_length; /* Serialization for this and the following elements not yet implemented */
PTCHAR script_name;
BYTE min_level;
} language;
我已经使用调试器进行了检查,并且已经分配了language.name,并且已经在调用SerializeLanguage的函数中正确分配了它。
定义UNICODE,以便调用相关函数的所有宽字符版本;这不是问题。
答案 0 :(得分:0)
这是你的问题,在第二个论点中:
CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name),
(lstrlen(Language->name) + 1) * sizeof(TCHAR));
您正在复制指针,而不是内容。这应该有效:
CopyMemory(&SerializedLanguage[CurrentIndex], Language->name,
(lstrlen(Language->name) + 1) * sizeof(TCHAR));