2011-10-25 7 views
2

私はstlデータ構造もシリアル化するいくつかの直列化ロジックを持っています。現在、私はサイズフィールドと構造体の各要素を反復処理して書きます。デシリアライズでは、サイズフィールドを読み、データ構造を読み終わった時点を知っています。iterator :: difference_typesはシステムに依存しません

サイズフィールドを正しく書き込む方法とシステムに依存しない方法はありません。現在、ファイルに格納するタイプとしてstd::iterator_traits<const_iterator>::difference_typeを使用しています。しかし、私は、このタイプがシステムに依存しないことが保証されている場合や、異なるシステム間でファイルを交換しようとするときに、変更される可能性があるかどうかはわかりません。

このタイプはstd::stringです。この場合、sizeof(std::iterator_traits<std::string::const_iterator>::difference_type)は64ビットマシンで8を返します。だから私はこの場合、これはちょうど1ワードを占めるsize_tのtypedefであると思います。私は現在32ビットのマシンを持っていないので、サイズが違うかどうかは確認できません。

これは、ポータブルスタンダードによって保証されていますか?または、長さをエンコードするために、ここですべてのデータ構造に固定タイプを使用すべきですか?

答えて

2

これは、ポータブルであることが保証されていますか、または長さをエンコードするためにすべてのデータ構造に固定タイプを使用すべきですか?

いいえ、移植性が低く、はい、固定サイズのタイプを使用する必要があります。ほとんどのアプリケーションでは、32ビット整数が問題ありません。シリアライゼーションコードと移植性の要件によっては、バイトオーダーの問題(リトルエンディアンとビッグエンディアン)にも直面する可能性があります。

詳細およびベストプラクティスについては、Qt QDataStreamのドキュメントを参照してください。 Qtの人々は、固定サイズの整数型(例えば、qint32)を決定し、その後、直列化するときに適切にキャストすることを推奨します。

+0

ここで固定サイズのタイプを使用して、プラットフォーム間で確実に動作するようにします。私はすでにバイトオーダーの問題を考慮しているので、ここでは小さな符号なし整数型を使用します。他のすべての型は、署名とサイズに関して完全修飾されているので、これは問題ではありません。 – LiKao

3

これらすべてのtypedefの要点は、ではありません。は、このタイプをグローバルに修正する必要があります。

シリアル化の場合は、シリアル化されたフォーマットを決定して修正する必要があります。その時点で、単にサイズを32ビット整数に収めるように要求し、与えられたサイズが変換して変換するかどうかをテストします。エラーが発生した場合は、シリアル化が失敗するようにするだけです(例:「データ構造はシリアル化できません」)。必要と思われる場合は、サイズフィールドを64ビットにして十分な余裕を持たなければなりませんが、柔軟性と使用状況からスペースを判断するのはあなた次第です。あなたは本当に40億以上の要素を持つ容器を持っていて、それをディスクに書きますか?

シリアライズは、意思決定と出版処方に関することであり、インポートとエクスポートの失敗の可能性を考慮して暮らしていなければなりません。

2

difference_type「は、符号付き整数型」(20.1.5、表32)であることが標準によって定義され、タイプptrdiff_ttypedefであることが必要である(20.1.5/4)、今度は、です、実装定義(5.7/6)。

ここでは共通の分母は「符号付き整数型」に変換可能であるため、この値をシリアル化する必要がある場合は、static_castlongのように入力して保存することをおすすめします。

関連する問題