0

後でファイルに保存するために、いくつかの Unicode テキスト (Windows TCHAR としてコード化された wchar_t) の文字列を含む、多数のメンバーを含む構造体をシリアル化しようとしています。保存する必要があるさまざまな構造体が多数あるため (それぞれに独自のシリアル化関数があります)、構造体の個々のメンバーを個別に記述するのではなく、ユニットとしてシリアル化したいのですが、渡すことができるようにしたいです。構造体は、シリアライズされると、実際にファイルに書き込む前に何らかのメタデータでラップする汎用関数に変換されます (また、作成中の付随するインデックスに追加されます)。

ただし、整数は正常にシリアライズおよびデシリアライズされますが、文字列は一度シリアライズ解除されると、本質的にランダムなテキストとして表示されます (毎回変化します)。

ここに私のシリアライゼーション関数があります:

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;

デバッガーで確認したところ、SerializeLanguage を呼び出す関数で language.name が割り当てられ、既に正しく割り当てられています。

UNICODE が定義されているため、関連する関数のすべてのワイド文字バージョンが呼び出されます。これは問題ではありません。

4

1 に答える 1

0

これがあなたの問題です、2番目の議論で:

CopyMemory(&SerializedLanguage[CurrentIndex], &(Language->name), 
    (lstrlen(Language->name) + 1) * sizeof(TCHAR));

コンテンツではなく、ポインタをコピーしています。これは機能するはずです:

CopyMemory(&SerializedLanguage[CurrentIndex], Language->name, 
    (lstrlen(Language->name) + 1) * sizeof(TCHAR));
于 2012-10-07T00:50:27.430 に答える