nueijeel
[Kotlin 오류] StreamCorruptedException invalid stream header: 7371007E 본문
[Kotlin 오류] StreamCorruptedException invalid stream header: 7371007E
nueijeel 2023. 6. 1. 17:25코틀린 최종 제출 과제를 구현하던 중 StreamCorruptedException 오류가 발생했다.
작성 중인 프로그램의 구조를 간단히 요약해 설명해보면,
- 카테고리를 생성하고, 카테고리 하위에 메모들을 생성할 수 있게 하는 프로그램인데, 카테고리와 메모들은 생성/수정/삭제가 가능하다.
- 카테고리는 사용자에게 이름을 입력받아 파일의 이름으로 사용했고, 메모는 제목과 내용을 입력받아 해당하는 카테고리 파일에 객체로 작성하는 형식을 사용했다.
이런 형식의 프로그램이다.
카테고리에 등록된 메모 내용을 수정해 파일에 다시 저장하는 과정에서 StreamCorruptedException 오류가 발생했다.
stack overflow에서 몇 가지 비슷한 오류 케이스를 찾았지만 영어를 해석해도 솔루션이 무슨 말인지 잘 모르겠어서,, 해결에 꽤 애를 먹었다.
다른 포스트들을 살펴보다가 아래 첨부된 블로그 포스팅에서 약간의 힌트를 얻어서 해결했다.
https://micropilot.tistory.com/2945
객체 직렬화를 위해서는 ObjectOutputStream 객체와 ObjectInputStream 객체가 짝지어 직렬화 - 역직렬화를 수행해야 하는데, 나는 카테고리 파일에 저장된 메모를 수정할 때, 메모 입력 시 사용한 ObjectOutputStream 객체를 사용하지 않고 새로운 ObjectOutputStream 객체를 생성해 사용했다. 바로 그 부분에서 오류가 났다.
그런데 한 파일에 대해서 하나의 ObjectOutputStream 객체와 ObjectInputStream만 사용해야 하기 때문에 ObjectOutputStream을 새로 생성하는게 안되는 건지, 아니면 새로 생성한 ObjectOutputStream 에는 짝짓는 ObjectOutputStream이 없기 때문인지..? 두 이유 중에 정확하게 어떤 이유에서 이 오류가 났는지는 모르겠다ㅜㅜ
아무튼 그래서 새로 생성한 ObjectOutputStream을 없앤 부분에 기존의 ObjectOutputStream이 생성된 메서드를 호출해 사용했다. 첨부한 블로그 글에서 말한 재사용을 적용해본 것이다.
기존에 ObjectOutputStream을 생성해 객체 직렬화를 하는 setMemoList() 메서드이다.
saveChangedMemoFile() 메서드의 for문 내에서 새로운 ObjectOutputStream을 사용했을 때 오류가 났으므로 setMemoList() 메서드를 호출해 기존의 ObjectOutputStream을 재사용하는 것으로 문제를 해결했다.
'Kotlin' 카테고리의 다른 글
[Kotlin 이론] 0517 Companion과 Generic, Null 처리 (0) | 2023.06.01 |
---|---|
[Kotlin 이론] 0516 Any, 추상 클래스와 인터페이스 (0) | 2023.05.24 |
[Kotlin 이론] 0515 지연 초기화와 오버라이딩 (0) | 2023.05.22 |
[Kotlin 이론] 0515 상속과 접근 제한자 (0) | 2023.05.22 |
[Kotlin 이론] 0512 클래스와 생성자 (0) | 2023.05.19 |