2013-05-04 3 views
0

Hy 얘들 아! 나는 자바에서 직렬화에 대한 몇 가지 오래된 게시물을 찾고 있었다. 개체를 ByteArray로 변환하려고합니다.ByteArray에 개체 serialize

public class test 
{ 

public static void main(String[] args) throws IOException 
{ 
    // 00111111 00111111 00111111 11110000 - in bytes: 63, 63, 63, 240 
    int x = 1061109744; 
    byte[] bytes = null; 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutput out = null; 
    try { 
     out = new ObjectOutputStream(bos); 
     out.writeObject(x); 
     bytes = bos.toByteArray(); 

    } 
    finally 
    { 
     out.close(); 
     bos.close(); 
    } 

    System.out.println("Lenght: " + bytes.length); 

    for(int i=0; i < bytes.length; i++) 
    { 
     System.out.println(bytes[i]); 
    } 
} 
} 

Aparently가 잘 작동하지만이 ByteArray에 "쓰레기"많이 소개 : 지금까지 I've는이 작업을 수행. 실제로 관심있는 값은 "int x = 1061109744;"에 해당하는 마지막 4 바이트입니다.

왜 그런가?

"정크"값을 피할 수 있습니까?

"서명 된"값을 초과 할 수 있습니까? (128보다 큰 바이트 값을 써야 함)

도와주세요.

+0

을 당신은 내가 같이 여기 http://stackoverflow.com/questions/2836646/java-serializable-object-to-byte-array –

답변

1

"정크"값을 피할 수 있습니까?

예. 이 아니라 int을 작성하십시오. writeObjectint를 전달하여, 당신이 그것을 홍보 직렬화 된 정보는 그것이 Integer객체 아닌 int 있다는 말 헤더 정보가 포함되어 있음을 의미한다 Integer에 (그것을 오토 박싱). ByteArrayOutputStream에는 바이트 (int의 하위 8 비트)를 출력 스트림에 쓰는 write(int) 메서드가 있습니다. 서명 여부는 순전히 해석의 문제이지 스트림의 비트는 아닙니다. 필드 직렬화에 의해

+0

예에서 확인할 수의 변수 "x"는 테스트 목적으로 만 사용됩니다. 실제로는 int 및 long 형식을 포함하는 "EventParser"라는 완전한 개체를 작성하려고합니다. 그리고 여전히 "서명 된"문제가 있습니다. – eduardo

+1

@eduardo : "실제"코드에서 객체를 사용하려는 경우 프리미티브를 사용하여 예제를 표시하는 것은 의미가 없습니다. "정크"를 원하지 않으면 자신 만의 직렬화 형식을 작성하십시오. Java 직렬화 형식에는, 스트림에 기입 해지는 오브젝트의 형태에 관한 헤더 정보가 포함됩니다. 그 점이 중요합니다. 그리고 다시 : 기호는 스트림의 비트가 아닌 * 해석 *의 문제입니다. –

+0

실수로 죄송합니다. 이제 "서명 한"에 대해 알게되었습니다! 물론 인쇄하려고하면 서명 된 것으로 표시되지만 스트림에서 단지 비트 일뿐입니다. – eduardo

0

사용 DataOutputStream과 필드 : 모든 요소 (자연) 서명 바이트 배열에서

ByteOutputStream baos = new ByteOuputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 

dos.writeInt(x); 

dos.close(); 
bytes = baos.toByteArray(); 

. 당신이 서명을 인쇄하려면 그러나 :

for(int i=0; i < bytes.length; i++) 
{ 
    System.out.println(0xFF & bytes[i]); 
} 
관련 문제