2009-05-19 10 views
0

FrageWie erkenne ich, dass ich mich am letzten Byte eines serialisierten Java-Objekts befinde?

Was ist (falls vorhanden) Zeichen/Byte-Sequenzen in serialisierte Java-Objekte beendet?

Hintergrund

Ich bin auf einem kleinen Selbsterziehung Projekt arbeiten, wo ich Java-Objekte serialisieren möchten und schreiben sie, wo zu einem Strom dort zu lesen und dann unserialisierten. Da muss ich die Grenzen zwischen serialisierten Objekten identifizieren und ich kann nicht sicher sein, dass das aktuelle Objekt nicht das letzte ist, gibt es ein abschließendes Zeichen, das immer da ist, das ich als meine Kennung verwenden kann?

Ich bemerkte, dass es eine magische Zahl ACED gibt, mit der ich den Anfang des Objekts identifizieren kann, also wie identifiziere ich das Ende?

EDIT: Wenn kein Endzeichen ist, gibt es eine sichere Abschluß Zeichen/Sequenzen, die I (insert) verwenden können, um das Ende des Gegenstands zu identifizieren?

+0

Das Byte nach dem aktuellen existiert nicht? : P – Louis

+0

@Lou Da der Stream könnte ein Netzwerk-Stream sein und wir könnten irgendwo blockieren. Daher sollte "nicht vorhanden" nur funktionieren, wenn wir das Ende des Streams erreicht haben. – Elijah

+0

Lou: Das Byte nach dem Ende eines Objekts ist das erste Byte des nächsten Objekts. –

Antwort

2

In der Theorie sollten Sie immer das Ende eines Objekts finden können, in der Praxis können Sie nicht. Ich verstehe das Problem ist writeObject Implementierungen, die entweder defaultReadObject oder readFields nicht eine Standard-Darstellung haben.

Ich habe in der Vergangenheit mit der Serialisierung gespielt. Einschließlich Erstellen von Streams für den Einsatz, wenn ich ungewöhnliche Dinge an der ObjectInputStream gemacht habe. Es ist nicht angenehm (!).

Sie können die Details in der spec lesen, und die Quelle ist es wert, gelesen zu werden.

0

Haben Sie darüber nachgedacht, eine Rekordmarkierungsschicht ähnlich wie HTTP Chunked encoding aufzutragen?

Die Chunked-Codierung soll eine Verallgemeinerung dieses Szenarios lösen: Identifizieren des Endes einer Nachricht von unbestimmter Länge, die beide kein identifizierbares Ende enthält und in einen längeren Stream eingebettet ist, ohne es zu beenden.

1

gibt es keine. AFAIK die einzige Voraussetzung ist, dass der Deserialisierer weiß, wann er zu lesen ist, wenn er eine entsprechende Serialisierung erhält. der Serialisierer kann dazu schreiben, was er will - in jeder Position, nicht nur in der letzten.

Wenn Sie alte Skool-Dump ein 32-Bit-Längenfeld am Anfang sind, weigern Sie sich, Objekte größer als 4 Gig zu behandeln.

nu scool, stellen Sie nur sicher, dass Ihre Lese- und Ihre Schreiblogik konsistent sind und sich nicht um die Länge kümmern.

1

Sie können Ihrem Objektstrom ein abschließendes Objekt hinzufügen. z.B. null oder ein spezieller String.

Ich schlage jedoch vor, dass Sie stattdessen die ObjectsStream in ein Byte [] konvertieren und die Byte-Länge des Bytes [], gefolgt von seinen Daten schreiben. Auf diese Weise ist jeder ObjectStream unabhängig und Sie wissen immer, wo er endet.

+0

Wie können Sie zwischen der Byte-Länge und den echten Daten unterscheiden, da sie auf demselben Array existieren? – insumity

+0

@foobar Sie geben immer zuerst die Länge an, dann wissen Sie, dass die Länge am Anfang ist. –

Verwandte Themen