2014-04-15 1 views
-1

원격 시스템에서 바이트 스트림을 읽어야한다는 요구 사항이 있습니다. 원격 시스템에는 바이트를 읽는 자체 클라이언트 API가 있습니다. 하지만 결국 바이트 배열을 POJO로 변환해야합니다. 그렇게하는 동안 오류 java.io.StreamCorruptedException: invalid stream header:이 발생합니다.왜 객체에 바이트 배열을 읽는 것이 java.io.StreamCorruptedException을 던집니까?

기능을 테스트하기 위해 Stringbyte array으로 변환하고 다음으로 바이트 배열을 Object으로 변환하는 프로그램을 작성했습니다.

 
public class ByteToObject { 
    public static void main(String[] args) { 
    try { 
     final String str = "Tiger"; 
     System.out.println("\nByte array for string '" + str + "' --> \n" + Arrays.toString(getByteArray(str))); 
     System.out.println("Object read --> " + getObject(getByteArray(str))); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 

    private static byte[] getByteArray(final String str) throws Exception { 
    return str.getBytes(CharEncoding.UTF_8); 
    } 

    private static Object getObject(final byte[] byteArray) throws Exception { 
    InputStream byteArrayStream = null; 
    ObjectInputStream inputStream = null; 

    try { 
     byteArrayStream = new ByteArrayInputStream(byteArray); 
     inputStream = new ObjectInputStream(byteArrayStream); 
     return inputStream.readObject(); 
     } finally { 
     if(null != byteArrayStream) { 
      byteArrayStream.close(); 
     } 
     if(null != inputStream) { 
      inputStream.close(); 
     } 
    } 
    } 
} 

출력은 다음과 같습니다

 
Byte array for string 'Tiger' --> 
[84, 105, 103, 101, 114] 
java.io.StreamCorruptedException: invalid stream header: 54696765 
Object read --> null 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804) 
    at java.io.ObjectInputStream.(ObjectInputStream.java:299) 
    at com.demo.serialize.ByteToObject.getObject(ByteToObject.java:41) 
    at com.demo.serialize.ByteToObject.main(ByteToObject.java:24) 

누군가가 여기에 무엇이 잘못되었는지를 도울 수 있다면 감사합니다?

+0

문자열을 바이트 배열로 변환 하시겠습니까? 원격 부분에서 문자열을 보냅니 까? – morgano

+0

어떤 줄이 실패합니까? 문자열이 아닌 객체를 가져 오는 것 같습니다. –

+0

원격 시스템이 문자열 또는 사용자 정의 객체를 전송합니다. 난 deserialization에 문제가 있는지 확인하기 위해이 간단한 프로그램을 썼습니다. – Niranjan

답변

4

스트림이 손상 되었기 때문에. 처음에는 문자열에 직렬화 된 데이터가 없어야합니다. 바이트 []로 되돌아가는 왕복이 손실됩니다. 그냥 byte [] 배열을 전달하십시오.

나를 따라 반복하십시오. 문자열은 바이너리 데이터의 컨테이너가 아닙니다. 100 번 쓰십시오 ;-)

편집 0x54696765는 "Tige"입니다. 처음에는 직렬화 된 객체가 없었습니다. 당신은 이미 문자열을 가지고 있습니다.

NB 랩핑 ObjectInputStream을 닫는 경우 ByteArrayInputStream을 닫을 필요가 없으며 ByteArrayInputStream 만 래핑하면 실제로 닫을 필요가 없습니다.

+0

자바에서 Strings에는 바이너리 데이터가 포함되어 있지 않다는 것을 알았지 만 왜해야만하는지 설명했다. 원격 시스템에서이 바이너리 데이터를 읽고 있는데이 원격 시스템은 모든 것을 바이너리 데이터로 저장합니다. 이제는 조직의 다른 시스템이 데이터를 원격 시스템에 생성하여 읽어야합니다. 데이터는 문자열 일 수 있으며 사용자 정의 객체 일 수 있습니다. 그런 상황을 해결할 다른 해결책이 있습니까? – Niranjan

+0

편집을 참조하십시오. 당신은 serialize 된 객체가 아닌 것을 deserialize하려고 시도하고 있습니다. 다른 끝에서 Java Object Serialization을 사용하고 있다는 증거가 있습니까? 당신은 단지 짐작하고있는 것처럼 보입니다. 바이너리 데이터를 읽는 경우에는 문자열을 구성하지 않아야합니다. 기간. – EJP

관련 문제