7

私はJavaシリアル化を始めたばかりであり、非ブロッキングI/Oを使用するシナリオでソースからオブジェクトを取得する方法がわかりません。

私が見つけることができるすべてのドキュメントは、ObjectInputStreamの使用がシリアル化されたオブジェクトを読み取る適切な方法であることを示唆しています。ただし、前述したように、私はjava.nioを使用しており、非ブロッキング操作を実行しています。新しいオブジェクトが利用可能になるまでreadObject()がブロックする場合、これは役に立ちません

まとめ..JavaNIOを使用する場合、どのようにシリアル化を行いますか?

4

3 に答える 3

4

ペイロードの長さを報告するプロトコルでシリアル化されたインスタンスをラップします。ペイロードが問題のインスタンスです。次に、完全なインスタンスを表すセグメントがあることがわかったら、それがブロックされないことを確認してObjectInputStreamを安全に使用できます。

このようなプロトコル最初の32ビット:ペイロードの長さペイロードの長さビット:シリアル化されたデータ

時々私も自分自身を驚かせます。

于 2009-09-26T21:42:59.733 に答える
-1

InputStream別のスレッドから追加できるバッファから読み取るを実装する(または実装を見つける)必要があります。

やろうとするのはかなり奇妙なことのように思えます。NIOはすべて高性能であり、シリアル化はそうではありません。

于 2009-09-26T17:24:36.010 に答える
-2

これは古典的です - 読み取るものが何もない場合、どうすれば .read() を実行できますか? NIO は明らかにパフォーマンス集約型であり、ノンブロッキング io の実現に専念しています。Socket.read() で nio を実行してみてください - それでもブロッキング操作が発生するか、タイムアウトで失敗します...データを生成しない限り、いくら空想しても「ポート」にデータが表示されることはありません...

final SecureRandom dataGenerator = SecureRandom.getInstance("SHA1PRNG");

final Integer range = new Integer( 'z' - 'a' );

for ( big loop ) 
{
   buffer.append( dataGenerator.nextInt ( range.intValue() + (int) 'a' ) );

// ............

do.something( buffer.toString() ); 

たとえ氷河のペースであっても、あなたの開発スキルは動きますが、動きます。

try {
    // Create a read/writeable file channel
    File file = new File("filename");
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

    // Create an output stream on the channel
    OutputStream os = Channels.newOutputStream(channel);

    // Create an inputstream on the channel
    InputStream is = Channels.newInputStream(channel);

    // Close the channel
    is.close();
} catch (IOException e) {
}

メッセージの編集: 私はあなたの重要な応答を把握します, readObjectNoData() を実装しようとしている CORBA に 12,000 行まで待ちます (「敵対的」または不完全なソース ストリームにもかかわらず、逆シリアル化されたオブジェクトを適切に初期化するのに役立ちます)

私の1回限りの擬似コードは、デコード、リロードなどのために何らかのデータストリームを提供することが期待されていました-私はあなたの投稿を読み直しました; そこにない可能性のあるオブジェクトでノンブロッキングioをread()する方法が書かれていると思います...これは、例外とスケジューリングの既知の問題を深く掘り下げ、その方法で質問をする誰かとこれを作業しようとして危険を冒しますあなたはそれを言いました、言い直してみて、他の人にあなたが求めていることを私に説明してもらいます.

すぐにタコススタンドに行きます。

于 2009-09-26T18:44:46.193 に答える