2009-05-19 4 views
0

질문직렬화 된 Java 객체의 마지막 바이트에 있음을 어떻게 식별합니까?

무엇 직렬화 된 자바 객체에 종료 문자/바이트 시퀀스 (어떤이있는 경우)?

배경

내가 자바 객체 직렬화가 읽은 다음 직렬화를하는 스트림에 기록하고 싶은 작은 자체 교육 프로젝트에서 일하고 있어요. 이후 직렬화 된 객체 사이의 경계를 식별해야하며 현재 객체가 마지막 객체가 아니라는 것을 확신 할 수 없습니다. 항상 식별자로 사용할 수있는 종료 문자가 있습니까?

개체의 시작을 식별 할 수있는 마법 번호 ACED가 있다는 것을 알아 채 셨습니다. 어떻게 끝을 식별합니까?

편집 : 어떤 종료 문자가없는 나는 개체의 끝을 확인하기 위해 (삽입)를 사용할 수있는 안전 종료 문자/시퀀스가 ​​ 경우?

+0

현재 바이트 다음의 바이트가 존재하지 않습니까? : P – Louis

+0

@ 루우 스트림이 네트워크 스트림 일 수 있으므로 어딘가에서 차단 될 수 있습니다. 그래서, "존재하지 않는다"는 것은 우리가 스트림의 끝에 도달했을 때만 작동해야합니다. – Elijah

+0

Lou : 객체 끝 뒤의 바이트는 다음 객체의 첫 번째 바이트가됩니다. –

답변

2

이론 상으로는 항상 객체의 끝을 찾을 수 있어야합니다. 실제로는 할 수 없습니다. 문제가 사용자 정의되었습니다. defaultReadObject 또는 readFields을 호출하지 않는 구현은 비표준 표현을 가지고 있습니다.

나는 과거에 일련 번호를 가지고 놀았습니다. ObjectInputStream에 비정상적인 일을하고있을 때 사용할 스트림을 만드는 것을 포함합니다. 그것은 즐겁지 않다 (!).

spec의 세부 정보를 읽을 수 있으며 출처는 읽을만한 가치가 있습니다.

0

HTTP Chunked encoding과 유사한 기록 표시 레이어를 적용 해 보셨습니까?

청크 인코딩은이 시나리오의 일반화를 해결하기위한 것입니다. 식별 할 수없는 끝 부분을 포함하지 않으며 더 이상 스트림에 끝내지 않고 포함 된 불확정 길이의 메시지 끝을 식별합니다.

1

없습니다. AFAIK 유일한 요구 사항은 디시리얼라이저가 해당 직렬화가 주어질 때 읽기를 멈출 때를 알 수 있다는 것입니다. 그럴 때, serialiser는 원하는 모든 것을 쓸 수 있습니다. 마지막 위치가 아닌 모든 위치에 쓸 수 있습니다.

오래된 스풀 덤프는 처음에는 32 비트 길이 필드를 덤프하고 4 기가 이상의 개체는 처리하지 않습니다.

누설 검색 도구를 사용하면 읽기 및 쓰기 논리가 일관되고 길이를 신경 쓰지 않아도됩니다.

1

개체 스트림에 종료 개체를 추가 할 수 있습니다. 예 : null 또는 특수한 String

그러나 ObjectStream을 byte []로 변환하고 바이트 [] 다음에 데이터의 길이를 쓰는 것이 좋습니다. 이 방법으로 각 ObjectStream은 독립적이며 항상 끝나는 위치를 알 수 있습니다.

+0

같은 배열에 존재하기 때문에 바이트 길이와 실제 데이터를 어떻게 구별 할 수 있습니까? – insumity

+0

@foobar 항상 길이를 넣으면 길이가 처음임을 알 수 있습니다. –

관련 문제