2

バイトの連続ストリームとしてシリアル化できるようにしたいオブジェクトがあります。2つの質問:

char1)このタスクに適した配列はありますか?そうでない場合、より良いオプションは何ですか?

2)これを行う最も効率的な方法は何ですか?これまでのところ、私が行ったことはを使用していmemcpyます。doubleたとえば、を通過せずに8バイトにキャスト/変換したり、charsその逆を行ったりすることは可能memcpyですか?

私はこのための外部ライブラリをよく知っていますが、新しいことを学ぶのが好きです。

4

2 に答える 2

1

シリアル化とは、オブジェクトを取得し、その表現のみを使用してオブジェクトを完全に再構築するために使用できる表現を与えることを意味します。通常、シリアル化はファイルストレージに適用されますが、ネットワークを介してオブジェクトを通信するためによく使用されます。

したがって、通常、charまたはunsignedcharを使用すると問題なく機能します。問題の本当の原因は、オブジェクトに含まれるすべてのものを確実に保存することです。これには、シリアル化しようとしているオブジェクトで参照されているオブジェクトが含まれます。

私は「ディープコピー」をグーグルで検索することから始めます。ディープコピーとシャローコピー

編集:memcpyは「浅いコピー」の形式です。

于 2012-11-06T00:43:01.870 に答える
1
  1. はい、charはこのタスクに最適です。

  2. 結果をファイルに保存し、同じアーキテクチャで再度読み取る場合は、memcpyで問題ありません。ただし、ソケットに通したり、別の場所で開いたりする場合は、さらに注意する必要があります。浮動小数点と整数型では、表現とエンディアンが常に問題になります。

float / integerで単純なmemcpyを実行しないでください(そして、バッファーからさらにキャストすることは避けてください(厳密なエイリアシングとUB))。

フローティングポイントの場合は、この2つの関数frexp()とldexp()を検索します。ウェブ上にはそれがたくさんあるので、ここにコピーする意味はありません。

積分の場合、次のようなことができます。

buffer[0] = integer >> 24;  
buffer[1] = integer >> 16;  
buffer[2] = integer >> 8;  
buffer[3] = integer;

これにより、同じ番号が返されることが保証されます。

于 2012-11-06T01:07:36.520 に答える