2012-08-24 2 views
1

직렬화 된 객체의 총 사용 된 크기를 직렬화하기 전후에 스트림에서 읽는 방법이 있습니까?Java에서 직렬화 된 객체의 크기를 바이트 단위로 읽으려면 어떻게해야합니까?

내가 찾을 수있는 유일한 방법은 그것을 다시 바이트 버퍼로 직렬화하고 버퍼 총 점유 된 크기를 볼 수 있습니다. 이것은 효과가 있지만 자원 낭비로 보입니다.

편집 : 메모리에로드되는 동안 Object 인스턴스가 사용하는 공간에 관심이 없습니다. 직렬화 된 크기 (바이트).

+0

java.lang.instrumentation.getObjectSize (o)는 어떻습니까? – Raman

+0

왜? 비 직렬화를 수행 할 필요가 없으며 나중에 전체 객체를 가질 때 필요하지 않습니다. 목적은 무엇입니까? – EJP

+0

다른 Java 및 비 Java 클라이언트와 통신 할 수있는 특수 전송 프로토콜을 구현하는 것이 목적입니다. 방금 구현했습니다 : 전체 개체를 메모리에 직렬화하고 바이트를 계산합니다. –

답변

2

직렬화 프로토콜이 출력 크기를 사전 계산하는 데 시간을 낭비하지 않기 때문에 직렬화되기 전에 크기를 결정할 수 없습니다. 완료 될 때까지 객체를 처리합니다.

비 직렬화 한 후 크기를 읽으려면 과 기본 스트림 사이에 CountingInputStream을 삽입 할 수 있습니다.

편집 : 크기 사전 직렬화를 절대적으로 결정해야하는 경우 ByteArrayOutputStream으로 직렬화하여 결과 바이트를 출력에 출력 할 수 있다고 가정합니다. 그러나이를 위해서는 발신자와 수신자 모두 바이트 처리 방법에 동의해야합니다.

+0

통찰력 주셔서 감사. 직렬화 된 헤더의 어딘가에 크기가있는 필드가있을 수 있다고 생각했습니다. API의 어딘가에 숨겨진 메소드 일 수도 있습니다. –

-1

직렬화 된 크기는 모든 필드와 그 자체의 합계입니다. Object의 크기를 확인하는 좋은 방법이 있다고 가정하고 있으므로 Object의 크기를 확인한 다음 모든 필드에 추가하십시오.

+0

나는 좋은 방법이 없다. 내가 아는 유일한 방법은 버퍼에 객체를 직렬화하고 그 결과 크기를 계산하는 것입니다. 내가 알고 싶은 것은 리소스의 크기를 계산하기 위해 버퍼에 객체를 쓰는 것없이 리소스를 낭비 할 필요없이 번호를 얻을 수 있다면 말입니다. –

+0

직렬화 된 크기는 패딩에 더하여 클래스 설명자와 값 태그 플러스 객체 핸들을 더한 값과 이미 직렬화 된 멤버 객체에 대한 핸들 효과를 더한 필드 값 크기의 합계와 함께 직렬화 가능한 기본 클래스에 대한 모든 것입니다 , writeReplace() 메소드가 수정 한 것처럼 수정 된 부모 클래스 체인의 임의의 위치에서 사용자 정의 writeObject() 또는 writeExternal() 메소드에 의해 그 안에 들어있는 요소를 더한 것입니다. -1. – EJP

+0

@EJP "패딩"은 클래스의 크기가 아니라 클래스의 크기가 아니라 클래스 크기라고 말합니다. "클래스 설명자, 값 태그, 더하기 객체 핸들, 멤버 객체 핸들의 효과를 뺀 값 이미 serialize 된 클래스와 serialize 가능한 기본 클래스에 대한 모든 것 외에도 writeReplace() 메서드가 사용자 정의 할 수있는 모든 항목에 의해 수정 된 부모 클래스 체인의 임의 위치에서 사용자 정의 writeObject() 또는 writeExternal() "이 모든 것은 수업에 해당한다. 그게 진절머리 나는 -1 ... 만약 당신이 -1 의견, 난 것입니다 –

관련 문제