2011-03-30 3 views
3

이 질문은 긴급한 요구가 아닌 호기심에서 묻습니다. 객체를 바이트 배열로 변환하는 코드를 발견했습니다 (당시 필자는 필요하다고 생각했습니다).16 진수로 인코딩 된 동일한 바이트 배열 "개체"와 다른 바이트 배열 형식의 바이트 배열로 변환됩니다. 왜?

commons-codec을 사용하여 순수 바이트 배열의 인코딩 된 16 진수 문자열 표현이 아래의 "toByteArray"메서드를 통해 바이트 배열을 전달한 경우와 다릅니다. 긴 버전은 16 진수 문자열 표현의 짧은 버전으로 끝나는 것으로 나타났습니다.

본능적으로 이것이 올바르게 보이지 않는 이유는 무엇입니까?

"toByteArray"변환 방법을 통해 발견되는 추가 바이트는 무엇을 나타내는가?

인코딩과 관련이 있다고 생각합니까?

많은 분들께 감사 드리며, 이것은 초보자 용 질문에 지나치지 않습니다.

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectOutputStream; 
import org.apache.commons.codec.binary.Hex; 

public class Test { 

    public static void main(String[] args) throws IOException { 
     byte[] bytes = "Stackoverflow".getBytes(); 
     System.out.println(Hex.encodeHexString(bytes)); 
     System.out.println(Hex.encodeHexString(toByteArray(bytes))); 
    } 

    public static byte[] toByteArray(Object obj) throws IOException { 
     byte[] bytes = null; 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(obj); 
     oos.flush(); 
     oos.close(); 
     bos.close(); 
     bytes = bos.toByteArray(); 
     return bytes; 
    } 
} 

RESULT

537461636b6f766572666c6f77 aced0005757200025b42acf317f8060854e002000078700000000d537461636b6f766572666c6f77

답변

7

첫번째 경우는 단지 콘텐츠 반면 그것이 객체 직렬화 포맷이기 때문에, 제 2 인코딩 훨씬 길다. 객체 직렬화에는 헤더, 객체 유형 및 마지막으로 객체의 내용이 있습니다 (끝이 동일 함을 알 수 있습니다)

+0

고마워 - 아직도 이걸 제대로 이해하지 못해 (하지만 그건 네 잘못이 아니야!). ObjectOutputStream을 사용하는 것이이 경우 부적절하다고 생각합니다. 어쩌면 DataOutputStream은 이미 바이트 배열 이었기 때문에 내가 예상 한 결과에 가깝게 뭔가를 제공했을 것이므로 더 이상 처리 할 필요가 없었습니다. –

+0

DataOutputStream은 이미 byte [] 인 경우 아무 작업도 수행하지 않습니다. –

2

ObjectOutputStream은 모든 유형의 객체를 직렬화 할 수 있습니다 (단, Serializable). 따라서 실제로는 byte[]을 다른 개체에 할당 할 여지가 없으므로 실제로는 매핑 할 수 없습니다.