2

編集:エラーの理由を見つけたのでこれを閉じますが、この投稿を削除する代わりに..より洗練された質問で新しい投稿を生成します。


皆さん、こんにちは。

読み込んだバイナリ データがいくつかあります。それを に変換したいので、 を入力データとして使用してSystem.Drawing.Imageのインスタンスを作成します。Image objectmemory stream

それを行った後、画像をシリアル化してから逆シリアル化します(ビジネスロジック用)。デシリアライズは例外をスローします。Imageメモリ ストリーム コンストラクターの代わりにファイル名コンストラクターを使用してインスタンスを作成すると、すべて 100% 動作します。これは、Imageオブジェクトをネットワーク経由でシリアル化できることを示しています。

私は何を間違っていmemory streamますか、私は使用しましたか?

これは、シリアル化される前に Image オブジェクトを作成するために使用するコードです:-

// Fake way of getting some binary (image) data.
byte[] data = File.ReadAllBytes("Chick.jpg");

using (Stream originalBinaryDataStream = new MemoryStream(data))
{
    // This works perfectly fine, if use this method (which i can't).
    //image = new Bitmap("Chick.jpg");

    // This throws an exception when it's deserialized.
    // It doesn't like the memory stream reference?
    image = new Bitmap(originalBinaryDataStream);     
}

これは、例外をスローするイメージをデシリアライズしようとするコードです (これは、例外の別のイメージです) 。

代替テキスト http://img254.imageshack.us/img254/9748/step1zx3wk5.png

正しく破棄されていない、またはシリアル化できないものがあります..したがって、例外がスローされますか?

助けてください :)


編集: 例外は私のImage Debugger Visualizerで呼び出されます。

完全な VS2008 ソリューションをここにアップロードしました(1.28 MB のダウンロード)。

その中には、ビジュアライザー クラスMS テスト クラスの 2 つのプロジェクトがあります。唯一の単体テストを実行すると、ワイヤーを介してデバッガーに渡された Image インスタンスの逆シリアル化に失敗するため、一般的な (読み取り: 役に立たない) GDI+ 例外がスローされます。ファイル パス コンストラクターを使用して作成された Image インスタンスを渡した場合、逆シリアル化は完全に機能します。

編集 2: 別のファイル アップロード サイトを使用しました - 乾杯!

EDIT 3:実際にエラーを再現する方法。

  • プロジェクトを DEBUG モードに変更します (リリース モードではありません)。
  • すべてのブレークポイントを削除します。
  • ImageDebuggerVisualizer.cs を開く
  • 22 行目にブレークポイントを追加します。
  • ここで、UnitTest1 単体テスト メソッドをデバッグします。画像が表示されます..そのウィンドウを閉じます..すると、突然ブレークポイントになります。それをまたぐと、ブーン!!!! クラッシュ!!バン。

編集 4: 例外の 2 つのスクリーン ショットを次に示します (ソリューション ファイルをダウンロードしたくない場合)。

4

3 に答える 3

3

実際のコードでは、MemoryStream巻き戻しではなく a に書いているのではないかと思います。この場合は、再ロードする前に Position を 0 に設定してください。

于 2008-11-26T12:39:15.247 に答える
2

コードをテストしたところ、うまくいきました。コードは問題ありません。イメージ ファイルまたはパスに問題があるはずです。これは私のテストです:

private void Form1_Load(object sender, EventArgs e)     
       {
            byte[] data = File.ReadAllBytes("c:\\t.jpg");

            using (Stream originalBinaryDataStream = new MemoryStream(data))
            {
                // This works perfectly fine, if use this method (which i can't).
                //image = new Bitmap("Chick.jpg");


                // This throws an exception when it's deserialized.
                // It doesn't like the memory stream reference?
                originalBinaryDataStream.Seek(0, SeekOrigin.End);
                pictureBox1.Image=  new Bitmap(originalBinaryDataStream);
            }
        }

そして、PictureBox に画像が表示されます。

于 2008-11-26T12:37:59.400 に答える
0

最初の質問投稿を、VS ソリューション全体 (1 つのクラスと 1 つの単体テスト) へのリンクで更新しました。単体テストは失敗失敗失敗例外をスローします。チェックアウトしてください。

于 2008-11-26T13:10:21.657 に答える