작은 직렬화 유틸리티를 작성 중이며 바이트 배열에 객체를 쓰려면 예약해야하는 바이트 수를 계산하고 싶습니다. 의 나는 내가 필드를 반복하고 그들이 가지고있는 크기를 찾기 위해 반사를 사용할 수 있다고 생각원시 필드의 크기를 직접 계산할 수 있습니까?
int age;
String name;
Colour colour;
boolean active;
...
같은 몇 가지 필드/게터와 클래스가 있다고 가정 해 봅시다,하지만 그들은 원시인지 내가 할 수있는 확인한다. 어느 쪽이 시작입니까? 객체의 오프셋을 short로 사용하기 때문입니다. 좋아, 사용할 수 있습니다
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