2016-10-17 36 views
1

私はDataOutputStreamを介してファイルにデータを書き出す一連のオブジェクトを持っています。java、DataOutputStreamでデータサイズを書き込む

私のアプリケーションファイル形式が進化するにつれて、私はそれ以上のデータオブジェクトを追加します。これは、アプリケーションの "古い"バージョンで読むことができるはずです。

これを行うには、オブジェクトデータの前に、現在のオブジェクトが占有するバイト数を示すサイズ値を設定する必要があります。

しかし、このデータは可変サイズにすることができます。特に文字列を処理する場合、サイズがどのようになるかは事前にわかりません。

それはDataOutputStreamの(特に方法 - のwriteByte、のwriteShort、のwriteInt、のwriteUTF)であるかのようにバイトのバッファへの「事前書き込み」への道があるバイトの長さを取り戻すために私を可能にしますデータをDataOutputStreamに書き出す前にこれにより、古いバージョンのアプリケーションで理解できる新しいデータオブジェクトをスキップすることができます。

+0

自分でオブジェクトをシリアル化していますか、javaのシリアル化を使用していますか? –

+0

データをバイナリ形式で保存する必要がありますか、データオブジェクトをテキストにマーシャリングすることができますか?ジャクソンのような図書館のJSONやYAML?デシリアライゼーションは、重い持ち上げのためにライブラリを使用するときにも非常に簡単になります。 –

+0

自分でシリアル化している場合は、[this](https://github.com/PlutoPowered/Nebula/blob/master/src/main/java/com/gmail/socraticphoenix/nebula/io/Bytes.java)を使用します。 #L29)テクニックを使用して文字列をシリアライズすることもできますが、NULL終了を使用することも可能です –

答えて

0

あなたがhereを見ることができるように、あなたはこのようにjava.lang.instrument.Instrumentation使用することができます

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

をしてから、オブジェクトのサイズをバイト単位で計算します

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

興味深いですね。しかし、それは私が探しているオブジェクトのサイズではなく、書き出されるバイナリデータのサイズまたは長さです。 – Simon

1

通常のJavaのシリアライズは、その素晴らしいではありません様々な理由から。最も重要なものの1つは、それが非常に脆く、「未来の証拠」ではないということです。可能であれば、別のシリアル化形式を使用することをお勧めします。特にシリアル化するクラスにフィールドを追加することについて具体的に言及している場合は特に注意してください。

ProtobufJSONなどの形式では、優れたAPIを備えたJavaライブラリと優れた転送/後方互換機能があります。ほとんどの場合、既存の問題を解決するよりも、データをより便利な形式にシリアル化する方がはるかに簡単です。

関連する問題