問題タブ [objectinputstream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 保存された (永続的な) シリアル化可能なオブジェクトが、アプリの新しいマーケット バージョンで正しく読み取れない
文字列の4つの配列リストを含む永続的なシリアル化可能なオブジェクトを格納するAndroidアプリがあります。このオブジェクトは内部メモリに保存され、アプリが起動するたびに復元されます。それは正常に動作します....問題は、市場でアプリの新しいバージョンを起動し、ユーザーが新しいバージョンをダウンロードしてインストールすると、保存されたオブジェクトが適切に回復されず、オブジェクトの4つの配列リストが空で回復されることです. その後、ユーザーは以前のバージョンのアプリに保存されたデータを失いました。これは私が解決しなければならない大きな問題です。
これは私のシリアライズ可能なオブジェクトです:
これらは、この永続オブジェクトを保存および回復するために使用する方法です。
アプリのバージョンが更新されていない場合、このコードは正常に機能することに注意してください。
なにが問題ですか?アプリのさまざまな Android マーケット バージョン間でこのデータを永続化するにはどうすればよいですか?
ありがとう
java - ObjectInputStream catchブロックはEOFExceptionを生成しますか?
これを上にドラッグして申し訳ありませんが、私はよく見てきましたが、それでもEOFExceptionが発生し続けます。私は以下を除いて私の方法からすべてをコメントしました:
私がやろうとしているのは、サーバーからクライアントにファイル、txt、またはmp3を渡すことだけです-を呼び出そうとさえしませんreadObject()
が、ObjectInputStream
それでもEOFExceptionが発生しますか?読み取ろうとしていないファイルの最後に到達するにはどうすればよいですか?実際、私はテキストファイルを1行ずつ読み込もうとしていたらいいのにと思います。なぜなら、それを完全にうまく行う方法を知っているからです。オブジェクトを受け取り、それをファイルにキャストしてファイルシステムに書き込みたいだけですが、何らかの理由で私のキャッチブロック:
プリントアウト:
着信データ割り当てエラー:java.io.EOFException
私はこのフォーラムの投稿にリストされているサーバーコードに沿ってフォローしようとしています。基本的にサーバーから、次の行を使用してファイルをクライアントに書き込みます。
誰かが私の側の愚かなエラーのように感じるものを修正する方法を説明できれば本当にありがたいです-事前に感謝します!
java - ObjectInputStream に大量のデータがある StreamCorruptedException
クライアントが多数のデータセットをサーバーに送信しているTCP経由のサーバークライアントセットアップがあります。読み書きは ObjectInput/OutputStream を使用します。通常は問題ないのですが、データフローが重くなると StreamCorruptedException: invalid type code が出てしまいます。無効なコードは毎回異なります。ソケットを 1 回開き、同期メソッドを呼び出して、複数のスレッドからデータを送信します。
クライアント:
サーバ:
更新: 各送信後に out.reset() を追加しましたが、問題は解決しませんでした。また、ループにスリープ ステートメントを追加して、データ レートを下げました。これによりエラーは解消されますが、実際の解決策ではありません。
編集:最初にこれを尋ねてから少し時間が経ちましたが、再び問題に直面しています。メッセージを送信するたびに、スレッドが「確認」メッセージを待機するようにシステムをセットアップしようとしました。受信プロセスに StreamCorruptedException がある場合、ack ではなく「再送信」が返されます。これは、解決策よりも多くの問題を引き起こしているようです。他のアイデアはありますか?
java - スレッド オブジェクト出力ストリーム オブジェクト入力ストリーム ブロッキングが読み取れない
私のコードは病気です。かなり単純なオブジェクトの書き込みおよび読み取り操作のように見えますが、その二次操作を起動することはありません。リモート ピアの内部クラス スレッドはConcurrentHashMap
、OOS を介して を送信します。
それが到着すると、受信コードはブール値で決定されたループで、その CCHM の更新を OIS でリッスンし続けます。これらの更新は、元の CCHM を送信した兄弟から送信されます (受信ピアごとに 1 つのサービス提供兄弟が存在します)。これらObjectOutputStreams
の兄弟が使用するものHashMap
は、兄弟の表示から取得されます。兄弟は、グループの新しいメンバーに送信するか、既存のメンバーに送信するかは気にしません。ピアが新規か既存かの違いは、元の CCHM が受信されて使用される受信ピア側でのみ認識され、コードは同じ OIS で更新を待ち続けます。参加する新しいピアの詳細は、リモートのHashtable
したがって、送信される CCHM は、すべてのピア (新しいものと既存の n 個) に送信されるたびに 1 要素大きくなります。
ただし、既存のピアは更新された CCHM を受信しません。コードを呼び出しでいっぱいにしSystem.out.println()
たり、大まかに停止したりするのではなく、この混乱の中で見落としがちな落とし穴は何ですか?
java - ObjectInputStreamを使用してアセットからバイナリファイルを読み取る
最近、速度を上げるために3Dモデル形式をASCIIではなくバイナリファイルに変換することにしました...いくつかのJavaチュートリアルを読みましたが、形式を読み取る最も簡単な方法はObjectInputStreamとreadLong()コマンドとreadFloat()コマンドが混在しています...しかし、コードを機能させることができないようです...
これが私のテストコードです:
この例では、ファイルから最初のLONGを読み取ろうとしていますが、IOExceptionが常にスローされ、これを修正するために何をすべきかわかりません。
どんな助けでも役に立ちます。
クイック追加:スタックトレースエラー出力:
java - Javaシリアル化-プロセスのクラッシュ後にシリアル化されたファイルを回復する
次のユースケースがあります。
- プロセスは、を使用して特定のオブジェクトをファイルにシリアル化します
BufferedOutputStream
。 - 各オブジェクトを書き込んだ後、プロセスはを呼び出します
flush()
- ユースケースは、オブジェクトの書き込み中にプロセスがクラッシュした場合、正常に書き込まれた前のオブジェクトまでファイルを回復したいというものです。
このようなファイルを逆シリアル化するにはどうすればよいですか?そのようなファイルを逆シリアル化する間、Javaはどのように動作しますか。
- クラッシュする前に正常に書き込まれたオブジェクトまで正常に逆シリアル化されますか?
- 最後に部分的に書き込まれたオブジェクトを読み取っている間、動作はどうなりますか。どうすればそれを検出できますか?
Update1-
- オブジェクトの書き込み中にプロセスを手動で強制終了することで、プロセスのクラッシュをシミュレートしようとしました。私は約10〜15回試しましたが、毎回ファイルを逆シリアル化でき、ファイルに部分的なオブジェクトがありません。
私のテストが十分に網羅的であるかどうかはわかりません。したがって、さらにアドバイスが必要です。
Update2- Adamは、ファイルをランダムに切り捨てることを使用して、このようなテストをシミュレートできる方法を指摘していました。以下は、約100回の反復を試したときに観察された動作です-
- 切り捨てられたファイル(プロセスがクラッシュしたときのファイルの状態と同等である必要があります)から、Javaは最後の完全なオブジェクトまで正常に読み取ることができます。
- 最後に部分的に書き込まれたオブジェクトに到達すると、Javaは
StreamCorruptedException
またはをスローしませんIOException
。単にEOFException
指示されたものをスローEOF
し、部分的なオブジェクトを無視します。
java - Java でソケット経由でオブジェクトを送信できません
私はこの問題を抱えていますが、何が悪いのかわかりません。私はインターネット上で検索しましたが、成功しませんでした。
そのため、Java のソケットを介してオブジェクトを送信する必要がありますが、その方法がわかりません。私は非常に多くの方法を試しました。オブジェクトをシリアル化し、オブジェクトを直接書き込もうとしました。しかし、何も機能していないようです。
詳細は、チャットを並行して実行していることです。また、ObjectOutputStream または ObjectInputStream を開くと、デッドロックが発生することがあります。そして、私はあなたたちが私を助けることができると思います.
クライアントがサーバーに接続し、サーバーがオブジェクトであるランダムな単語をクライアントに送信するハングマン ゲームです。
サーバ:
クライアント:
java - ObjectInputStream を取得して、さまざまなオブジェクトを表示します
サーバークライアントアプリケーションを作成しています。私のアプリケーションには、チャット部分とゲーム部分の 2 つの部分があります。チャットをするときは String オブジェクトを送信し、ゲームをプレイするときは Game オブジェクトを他のコンピュータに送信します。ObjectInputStream に 2 種類のオブジェクトの違いを認識させるにはどうすればよいでしょうか。私はそのようなことを試みてきました:
ゲームオブジェクトを使用したいときに NotSerializableException をスローしますが、チャットパートは機能しています。
java - objectInputStream は常に直列化されたクラスから最初のインスタンスだけを読み取ります
シリアライズ可能を実装するクラスを作成しました。サーバークライアントアプリケーションを介してオブジェクトを受信すると、最初のインスタンスしか取得できません。オブジェクトが何度変更されても、objectInputStream は最初に送信されたものだけを受信します。なぜですか?
これは実際にはスイング アプリケーションです。私のアプリケーションでは、chatpart と gamepart が同時に実行されています。
パネルはゲーム オブジェクトをサーバー/クライアント オブジェクトに送信します
サーバーまたはクライアント部分がスレッドで実行されている
ゲームパートまたはチャットパートのいずれかからデータを読み取ります。チャットパートは正常に動作します
ゲームクラスは、いくつかの String 属性を持つ単純なクラスであり、Serializable を実装します。
java - ObjectInputStreamのIOExceptionを回避するために、いつどこでclose()メソッドを使用する必要がありますか?
tcpを介してクライアントプログラムからオブジェクトを読み取ろうとしています。この行でわかるように、objectInputを作成しました。
そして、他のプログラムから私の入力を読みます。プログラムをクリーンアップするために小さな変更を加えるまでは、以前は正常に機能していました。個人的に私が追加したと仮定します
私の質問は、オブジェクトを読んだ後、objectInputStreamを閉じるか、閉じずにそのままにしておく必要がありますか?使用後すぐに閉じるか、ifブロックの最後またはプログラムの最後に閉じる必要がありますか?クローズの効果は何ですか?ちなみに私は詳細なドキュメントを読みました。
エラーは次のとおりです。
これが私のコードです: