2009-09-26 10 views
7

Ich beginne gerade mit der Java-Serialisierung, und mir ist nicht klar, wie Sie Objekte aus einer Quelle in einem Szenario mit nicht blockierenden I/O.Java serialisierbar, ObjectInputstream, nicht blockierende E/A

Die gesamte Dokumentation, die ich finden kann schlägt mit ObjectInputStream ist die richtige Weg in serialisierten Objekten zu lesen. Wie bereits erwähnt, verwende ich java.nio und führe blockierungsfreie Operationen aus. Wenn readObject() blockiert wird, bis ein neues Objekt verfügbar ist, kann mir das nicht helfen

Zusammenfassung .. Wie funktioniert die Serialisierung bei der Arbeit mit Java NIO?

+0

vielleicht können Sie die available() -Methode verwenden, wenn der Stream abfragt, ob Bytes zu lesen sind. – clamp

+0

Tippfehler: das sollte natürlich "... des Streams" lauten. – clamp

Antwort

4

Umschließen Sie die serialisierten Instanzen in einem Protokoll, das eine Nutzdatenlänge meldet, und die Nutzlast ist die fragliche Instanz. Wenn Sie dann wissen, dass Sie ein Segment haben, das eine vollständige Instanz darstellt, können Sie ObjectInputStream sicher verwenden und wissen, dass es nicht blockiert.

Protokoll ähnliche ersten 32 Bit: Payload Länge Payload Länge Bits: serialisierten Daten

Manchmal überraschen ich mich selbst.

+0

Jetzt weiß ich, warum Fortran-Strings mit der String-Größe beginnen, dann content.http: //www.ibiblio.org/pub/languages/fortran/ch2-13.html – whatnick

-1

Sie müssen eine InputStream implementieren (oder eine Implementierung finden), die aus einem Puffer liest, den Sie an einen anderen Thread anhängen können.

Es scheint eine ziemlich seltsame Sache, zu versuchen, zu tun. Bei NIO geht es um hohe Leistung und bei Serialisierung nicht.

+0

Ich benutze nio, weil ich die Schnittstelle einfacher finde, wenn es um eine große Anzahl von Streams geht. Leistung ist kein vorrangiges Anliegen. – Mike

-2

Das ist klassisch - wie kann man .read() lesen, wenn nichts zu lesen ist? NIO ist eindeutig leistungsintensiv und darauf ausgerichtet, nicht blockierende io zu erreichen. Versuchen Sie, nio auf Socket.read() zu tun - Sie werden immer noch entweder eine Blockierung Operation oder Durchfall bei Timeout ... keine Menge Phantasie wird dazu führen, dass Daten auf dem 'Port' erscheinen, wenn Sie einige Daten erzeugen ...

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()); 

Jetzt bewegen sich Ihre Entwicklungsfähigkeiten, auch wenn sie sich auf einem Gletscherpace bewegen.

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) { 
} 

Nachricht bearbeiten: Ich kritische Reaktion erfassen, warten, bis Ihre zwölftausend Linien in CORBA versuchen readObjectNoData() (nützlich für die Initialisierung deserialisiert Objekte richtig trotz eines „feindlichen“ oder unvollständigen Quellenstrom) zu implementieren

Meine einmalige Pseudo-Code wurde erwartet, um eine Art von Datenstrom zu entschlüsseln, neu zu laden oder was auch immer - ich las Ihren Beitrag erneut; Ich denke, es sagt, wie man non-blocking io auf einem Objekt liest, das nicht da sein kann ... das tief in bekannte Probleme von Exception und Scheduling eindringt, wird heikel versuchen, dies mit jemandem zu tun, der die Frage in der Art stellt Du hast es formuliert, versuche es neu zu formulieren und andere erklären zu lassen, was du fragst.

Ich werde im Moment zum Taco Stand gehen.

+0

Ich glaube nicht, dass Sie meinen Beitrag gelesen haben. Ich suche nach einer Möglichkeit, Serialisierung auf einem nicht blockierenden Stream auszuführen. – Mike

Verwandte Themen