私は小さなシリアル化ユーティリティを書いています。バイト配列にオブジェクトを書き込むために必要なバイト数を計算したいと思います。 のは、私は私がフィールドを反復処理し、彼らが持っているもののサイズに見えるためにリフレクションを使用すると考えていたプリミティブフィールドのサイズを直接計算する方法はありますか?
int age;
String name;
Colour colour;
boolean active;
...
のようないくつかのフィールド/ゲッターを持つクラスを持っていると言うが、彼らは原始的であるかどうか私にできることすべてをチェックしています。私はオブジェクトのオフセットとしてショートを使用するので、これは始まりです。はい、私は使用できます
if(field.getType() == int.class) {
size = Integer.BYTES;
}
または地図を使用します。私はプリミティブのサイズを知る必要があるので、それほど難しくありません。しかし好奇心から:直接的な方法はありますか?
明示的に編集する: 私はDataOutput/InputStreamのようなデータをシリアライズするために使用しています。
は、APIクラスは次のようになります。
public final void write(int i) {
checkBounds(Integer.BYTES);
PrimitiveWriteUtil.write(i, data, marker);
advance(Integer.BYTES);
}
実際の作業は、ユーティリティクラスによって行われますので、
public static void write(int i, byte[] target, int pos) {
target[pos] = (byte) ((i >>> 24) & 0xFF);
target[pos + 1] = (byte) ((i >>> 16) & 0xFF);
target[pos + 2] = (byte) ((i >>> 8) & 0xFF);
target[pos + 3] = (byte) ((i >>> 0) & 0xFF);
}
だから、私は私のバイト配列の必要なサイズを知りたいです私は後でチェックし、サイズを変更する努力を避けることができます。
可能な複製:http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –
私は見て回ったそれは以前のものであり、私のユースケースにはまったく合致しません。私は実行時に_one_オブジェクトのすべてのプリミティブフィールドのサイズを取得したいだけです。 – Silverclaw
なぜですか? ByteArrayOutputStreamに書き込み、そこからバイト配列を取得するだけです。それは正しいサイズになります。 – EJP