티스토리 뷰

프로그래밍을 하다 보면 처리한 내용을 저장하거나 가져오는 용도로 파일 입출력을 자주 사용하게 된다.

이럴 때 쓰이는 자주 쓰이는 것들이 json, xml, csv인데, 이 중 json으로 입출력 하는 방법에 대해서 서술해 볼 까 한다.

 

※ json 파일을 입출력하고 싶다면 System.Text.Json 패키지를 using으로 가져와야합니다.

[정확히는 필수 까지는 아닌데, 관련 패키지 없이 진행하면 난이도도 그렇고 복잡도도 그렇고 엄청나게 뜁니다.]

출력(저장)

1.  저장할 자료들을 담고 있는 구조체 혹은 클래스를 제작한다.

사실상 저장할 자료들을 선별하는 단계. 동시에 후술할 직렬화 과정과 더불어서 오류의 발생 원인 1위인 영역이다.

이유는, 이 작업이 은근히 예민하기 때문. 잘못하면 nullException이라던지 이것저것 일어난다. 버그 리포트도 여기가 아닌 다른 곳에서 터지기 때문에 찾기도 힘든 건 덤.

 

이 단계에서 주의해야 할 점은 다음과 같다.

 

자료형은 모두 string으로 통일한다.

string이 아닌 다른 자료형은 에러가 자주 난다. 심지어는 int 까지도.

어지간하면 string으로 변환해서 저장하고, 나중에 불러올 때 원래 자료형으로 되돌리자.

 

너무 복잡한 변수 구조는 사용하지 않는다.

무슨 말인고 하면, 이 과정에서 2차원 배열이 들어가도 오류가 터진다.

[심지어는 컴파일러가 잡아내지도 못한다!]

배열을 담고있는 리스트 같은 건 잘만 작동하는데 2차원 배열은 안되는 듯 하다.

어지간하면 2차원 이상으로 구성했던 게 있다면 1차원으로 분리해서 저장하고, 나중에 불러와서 합치는 방식으로 구성하는 것이 좋다.

 

프로퍼티는 반드시 넣을 것.

프로퍼티를 넣지 않으면 에러가 난다고 한다. (직접 해보지는 않았다.)

배열이나 리스트는 아래 방법으로 프로퍼티 적용이 가능하다.

val[] value {get; set;} = new val[index]; ← 배열에서의 프로퍼티 사용법.
List<val> value {get; set;} = new List<val>() ← 리스트에서의 프로퍼티 사용법.

 

위 과정이 모두 끝났다면 이제 파일 출력을 할 시간이다.

 

// 저장 위치 지정
string dir = Directory.GetCurrentDirectory() + "\\파일명";

// dir 디렉토리가 없다면 추가
if(!Directory.Exists(dir)
	Directory.CreateDirectory(dir);
    
// 구조체 직렬화
string fileString = JsonSerializer.Serialize(data);

// 파일 출력
File.WriteAllText(Path.Conmbine(FilePath, fileName), fileString);

사실 특기할 만 한 것은 구조체 직렬화 밖에 없다.

나머지는 디렉토리 관련 작업을 하다 보면 자주 다루게 될 내용들이기 때문.

 

상단의 구조체 작성 시에 실수를 했다면 주로 여기서 오류가 난다. nullException이라던지.

발생했다면 위쪽에서 이상한 부분이 없는 지를 확인하자.

 

입력(불러오기)

파일 읽어들이기

출력과 역순으로 진행된다. 따라서 파일을 읽는 것을 먼저 하게 되며, 이후 각각의 자료해 할당하는 방식으로 진행된다.

// 경로 지정
string dir = Directory.GetCurrentDirectory() + 목표 폴더 + 폭표 json 파일

// 파일 읽기
if (File.Exixt(FilePath)) // 파일이 있다면
{
       dataString = File.ReadAllText(dir) // 파일을 읽어서 dtaString에 할당한다.
       saveData = JsonSerializer.Deserialize(dataString) // 파일 내용을 역직렬화 하여 변수에 저장한다.
 }

 

세이브 데이터 적용하기

이렇게 읽어들인 데이터를 각자의 위치에 맞게 적용시키면 저장 시스템 구현이 완료된다.

string으로 변환한 상태이므로 각자의 자료형으로 변환시켜서 사용해야 한다.

 

 

마치며

파일 입출력 부분은 사소한 실수에도 버그가 터지는 데다가 이래저래 헤매기 쉽고 버그 리포트도 엉뚱한 곳에서 뜨기 때문에 사실 이 글 하나로 만족할 건 아니다.

그런 만큼 갑자기 시작하면 머리가 텅 비게 되는 것도 파일 입출력이기 때문에 간단하게라도 정리했고, 이를 바탕으로 작업을 한다면 조금은 나은 상황이 되지 않을까. 그런 마음에 작성해 봤다.

 

나중에 시간 낼 수 있으면 내서 csv와 xml도 알아봐야 할 거 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함