2016-10-17 5 views
1

Ich habe eine Reihe von Objekten, die ihre Daten über DataOutputStream in eine Datei schreiben.Java, Datengröße schreiben mit DataOutputStream

Während sich mein Anwendungsdateiformat entwickelt, werde ich weitere Datenobjekte hinzufügen, die von "älteren" Versionen der Anwendung gelesen werden können.

Um dies tun zu können, muss ich den Objekten Daten mit einem Größenwert voranstellen, der die Anzahl der Bytes angibt, die das aktuelle Objekt aufnehmen wird.

Da diese Daten jedoch eine variable Größe haben können, insbesondere beim Umgang mit Strings, kann ich nicht im Voraus wissen, wie groß die Größe sein wird.

Gibt es eine Möglichkeit zu einem Byte-Puffer zu „pre-write“, als ob es ein Dataoutputstream waren (Methoden insbesondere - writeByte, writeshort, writeInt, writeUTF), die es mir ermöglichen, die Byte-Länge, um wieder der Daten vor dem Schreiben in den DataOutputStream? Dadurch kann ich neuere Datenobjekte überspringen, die ältere Versionen der Anwendung verstehen.

+0

Serialisieren Sie Objekte selbst oder verwenden Sie die eingebaute Serialisierung von Java? –

+0

Müssen Sie die Daten im Binärformat speichern oder können Sie Ihre Datenobjekte in Text mappen, z. JSON oder YAML mit einer Bibliothek wie Jackson? Die Deserialisierung sollte auch sehr einfach werden, wenn eine Bibliothek für das schwere Heben verwendet wird. –

+0

Wenn Sie es selbst serialisieren, verwende ich [dies] (https://github.com/PlutoPowered/Nebula/blob/master/src/main/java/com/gmail/socraticphoenix/nebula/io/Bytes.java # L29) Technik, um Strings zu serialisieren, aber Sie könnten möglicherweise null Terminierung auch verwenden –

Antwort

0

Wie Sie here sehen können, könnten Sie java.lang.instrument.Instrumentation auf diese Weise verwenden:

import java.lang.instrument.Instrumentation; 

public class ObjectSizeFetcher { 
    private static Instrumentation instrumentation; 

    public static void premain(String args, Instrumentation inst) { 
     instrumentation = inst; 
    } 

    public static long getObjectSize(Object o) { 
     return instrumentation.getObjectSize(o); 
    } 
} 

und dann die Größe in Bytes des Objekts berechnen:

public static void main(String [] args) { 
    Object myObject = ...; 
     System.out.println(ObjectSizeFetcher.getObjectSize(myObject)); 
    } 
+0

Sieht interessant aus. Es ist jedoch nicht die Größe des Objekts, nach dem ich suche, sondern die Größe oder Länge von Binärdaten, die ausgeschrieben werden. – Simon

1

Regular Java Serialisierung ist nicht so toll aus einer Vielzahl von Gründen. Eine der wichtigsten ist, dass es sehr spröde ist und nicht "zukunftssicher" ist. Wenn möglich, würde ich vorschlagen, dass Sie ein anderes Serialisierungsformat verwenden, besonders wenn Sie ausdrücklich erwähnen, dass Sie Felder zu der Klasse hinzufügen möchten, die Sie serialisieren.

Formate wie Protobuf und JSON haben Java-Bibliotheken mit netten APIs und guten Vorwärts/Rückwärts-Kompatibilitätsfunktionen. In den meisten Fällen wäre es viel einfacher, Ihre Daten in ein bequemeres Format zu serialisieren, als die Probleme des bestehenden zu lösen.

Verwandte Themen