この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 18725|答える: 0

[出典] シリアライズとデシリアライズについての質問があります

[リンクをコピー]
掲載地 2015/10/27 19:07:26 | | | |
昨日、データベース同期テストをしていたとき、少しシリアライズとデシリアライズの技術を使いました。 テーブルのフィールドをエンティティクラスDiagramInfoに抽象化し、クライアントの新しいレコードをジェネリックコレクションに保存し、このジェネリックコレクションをシリアライズしてTCP経由でサーバーに送信し、TCPがデシリアライズしてからデータベースに書き込みます。 おそらくこの作戦のプロセスはこれでしょう。

       シリアライズ:System.Runtime.Serialization.Iformatter クラスを使って、汎用コレクションをバイナリストリームにシリアライズします。 シリアル化されたコードの一部は以下の通りです:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
コードをコピーします
その後、TCPプロトコルで送信しますが、この部分は省略されます。

サーバーはデータを部分的に受信し、メモリストリームとして保存し、その後デシリアライズします。コードの一部は以下の通りです。
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
コードをコピーします
この時点でクライアントとサーバーを起動してデータを同期すると、以下のエラーメッセージが表示されます。
エラー挙動:図 = (リスト)フォーマター。 Deserialize(memstream);
文字通り:変換が完了する前にストリームの終わりに遭遇しました。
2. 解Google検索の結果、以下の誤りの可能性に答えた人がいました:
1. シリアライゼーションとデシリアライズの種類は異なり、ここでは除外できます。
2. シリアル化時にストリームをクリアするバッファがなく、Flush()メソッドは使用されず、ここでも除外できます。
3. デシリアライズ前の受信プロセスのバッファサイズが十分でない場合もありますが、問題はないと思います。デシリアライズは取得ストリームの後に行われるもので、バッファのサイズとは関係ないはずです。個人的な意見ですが、試したことはありません。
4. デシリアライズの前に追加ストレム。 位置=0。 (Streamはデシリアライズされるストリームで、実際にはmemstreamです)
テストの結果、4つ目は私のプログラムに合うかもしれません。 では、なぜこのような現象が起こるのでしょうか?デバッグの一段階で、メモリストリームを観察してください。 Postionの値は変化し、書き込み操作が行われるたびに値が末尾を指していることが判明し、これがプログラムがそのようなエラーを報告する理由を説明しています。 しかし、なぜデシリアライゼーション関数が(Deserialize)を、デフォルトでストリーム全体をデシリアライズするのではなく、ポジトンの位置から始めるのですか?





先の:String[3]: Sizeプロパティのサイズが無効で0です。
次に:VS2010 接続サーバー VSSS2005 タイムエラー。問題は図に示されている通りです。神の助けを求めてください
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com