nueijeel

[Kotlin 오류] StreamCorruptedException invalid stream header: 7371007E 본문

Kotlin

[Kotlin 오류] StreamCorruptedException invalid stream header: 7371007E

nueijeel 2023. 6. 1. 17:25

코틀린 최종 제출 과제를 구현하던 중 StreamCorruptedException 오류가 발생했다.

 

작성 중인 프로그램의 구조를 간단히 요약해 설명해보면,

 

-  카테고리를 생성하고, 카테고리 하위에 메모들을 생성할 수 있게 하는 프로그램인데, 카테고리와 메모들은 생성/수정/삭제가 가능하다. 
-  카테고리는 사용자에게 이름을 입력받아 파일의 이름으로 사용했고, 메모는 제목과 내용을 입력받아 해당하는 카테고리 파일에 객체로 작성하는 형식을 사용했다.

 

이런 형식의 프로그램이다. 

 

 

카테고리에 등록된 메모 내용을 수정해 파일에 다시 저장하는 과정에서 StreamCorruptedException 오류가 발생했다.

 

stack overflow에서 몇 가지 비슷한 오류 케이스를 찾았지만 영어를 해석해도 솔루션이 무슨 말인지 잘 모르겠어서,, 해결에 꽤 애를 먹었다.

다른 포스트들을 살펴보다가 아래 첨부된 블로그 포스팅에서 약간의 힌트를 얻어서 해결했다.

 

https://micropilot.tistory.com/2945

 

java.io.StreamCorruptedException: invalid type code: AC

자바 스트림 클래스 사용시 발생하는 오류해결 예 자바 네트워크 프로그래밍에서 자주 사용되는 ObjectInputStream 에서 발생하는 다음과 같은 스트림 오류를 해결한 예이다.java.io.StreamCorruptedException

micropilot.tistory.com

 

객체 직렬화를 위해서는 ObjectOutputStream 객체와 ObjectInputStream 객체가 짝지어 직렬화 - 역직렬화를 수행해야 하는데, 나는 카테고리 파일에 저장된 메모를 수정할 때, 메모 입력 시 사용한 ObjectOutputStream 객체를 사용하지 않고 새로운 ObjectOutputStream 객체를 생성해 사용했다. 바로 그 부분에서 오류가 났다.

 

 

그런데 한 파일에 대해서 하나의 ObjectOutputStream 객체와 ObjectInputStream만 사용해야 하기 때문에 ObjectOutputStream을 새로 생성하는게 안되는 건지, 아니면 새로 생성한 ObjectOutputStream 에는 짝짓는 ObjectOutputStream이 없기 때문인지..? 두 이유 중에 정확하게 어떤 이유에서 이 오류가 났는지는 모르겠다ㅜㅜ

 

아무튼 그래서 새로 생성한 ObjectOutputStream을 없앤 부분에 기존의 ObjectOutputStream이 생성된 메서드를 호출해 사용했다. 첨부한 블로그 글에서 말한 재사용을 적용해본 것이다.

 

 

기존에 ObjectOutputStream을 생성해 객체 직렬화를 하는 setMemoList() 메서드이다.

 

saveChangedMemoFile() 메서드의 for문 내에서 새로운 ObjectOutputStream을 사용했을 때 오류가 났으므로 setMemoList() 메서드를 호출해 기존의 ObjectOutputStream을 재사용하는 것으로 문제를 해결했다.

728x90