struct
バイナリを使用してC++を直接書き込むことによってシリアル化されたファイルがいくつかありますfstream
。ここで、対応するC#クラスの読み取りメソッドを生成すると、おそらく構造体のパッキングが原因で、これらが実際には1対1にマップされていないことがわかります。
だから私の質問は-状況を処理するための最良の方法は何ですか?私はC++とC#の両方のソースコードを持っているので、どちらの部分も変更できます。パッキングせずにC++をシリアル化する必要がありますか(これはで行われると思い#pragma pack(1)
ます)、代わりにギャップを考慮してC#コードを調整する必要がありますか?
それとも、逆シリアル化の問題は完全に異なり、パッキングとは関係ありませんか?
更新1C++enum
の長さが4バイトで、bool
値の長さが2バイトであることを発見しました(誰が知っていましたか?)が、追加した後でも#pragma pack(1)
、最初のレコードしか正しく読み取ることができません。また、バイト数をチェックしsizeof(MyStructure)
、値が一致していることを確認しました。これは、レコード間にパディングがあることを意味している必要があります。
アップデート2ダーン、コードにバグが見つかりました。コピー&ペーストエラー。PVSStudioか何かが必要です。今はすべて良いです。(そして、ええ、ブール値は1バイトの大きさです。)