원격 시스템에서 바이트 스트림을 읽어야한다는 요구 사항이 있습니다. 원격 시스템에는 바이트를 읽는 자체 클라이언트 API가 있습니다. 하지만 결국 바이트 배열을 POJO로 변환해야합니다. 그렇게하는 동안 오류 java.io.StreamCorruptedException: invalid stream header:
이 발생합니다.왜 객체에 바이트 배열을 읽는 것이 java.io.StreamCorruptedException을 던집니까?
기능을 테스트하기 위해 String
을 byte 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)
누군가가 여기에 무엇이 잘못되었는지를 도울 수 있다면 감사합니다?
문자열을 바이트 배열로 변환 하시겠습니까? 원격 부분에서 문자열을 보냅니 까? – morgano
어떤 줄이 실패합니까? 문자열이 아닌 객체를 가져 오는 것 같습니다. –
원격 시스템이 문자열 또는 사용자 정의 객체를 전송합니다. 난 deserialization에 문제가 있는지 확인하기 위해이 간단한 프로그램을 썼습니다. – Niranjan