본문 바로가기
프로그래밍 이야기/GameDev

[C#] File - BinaryFormatter

by Mulder5 2020. 12. 8.
반응형

데이터를 파일에 저장할 때 저장 값들을 규격화하여 쓰고 읽어보자. 이에 대해 다음의 단계를 거친다.

1. 저장할 값을 struct, class로 규격화하여 구현한다. 
2. 이 struct, class에 [serializable] 키워드를 붙여 준다.
3. FileStream을 생성한다.
4. BinaryFormatte로 파일을 작성한다.
5. FileStream을 닫아준다.

다음은 Player 배열을 BinaryFormatter를 이용해 파일에 쓰고 읽는 방법에 대한 예제이다. 

[Serializable]
struct Player
{
    public string _Name;
    public int _Level;
    public double _Exp;
}

class Program
{
    const string fileName = "savePlayer.txt";

    static void Main(string[] args) {
        Player[] player = new Player[2];

        player[0]._Name = "aaa";
        player[0]._Level = 10;
        player[0]._Exp = 5400;

        player[1]._Name = "bbb";
        player[1]._Level = 99;
        player[1]._Exp = 53460;

        //쓰기
        FileStream fsW = new FileStream(fileName, FileMode.Create);

        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fsW, player);

        fsW.Close();


        //읽기
        FileStream fsR = new FileStream(fileName, FileMode.Open);

        BinaryFormatter bf2= new BinaryFormatter();
        Player[] readPlayer = (Player[])bf2.Deserialize(fsR);

        for(int i = 0; i < readPlayer.Length; i++) {
            Console.WriteLine("Name: " + readPlayer[i]._Name);
            Console.WriteLine("Level: " + readPlayer[i]._Level);
            Console.WriteLine("Exp: " + readPlayer[i]._Exp);
        }

        fsR.Close();
    }
}

파일을 읽을때는 FileMode.Open이 사용된다. 실재 값을 읽어 들일 때, Deserialize()는 Object type을 리턴하므로 실재 사용하는 type으로 캐스팅해줘야 한다. 

다음은 Player에 대한 List를 BinaryFormatter를 이용한 파일 쓰기, 읽기에 대한 예이다.

[Serializable]
struct Player
{
    public string _Name;
    public int _Level;
    public double _Exp;
}

class Program
{
    const string fileName = "list.dat";

    static void Main(string[] args) {
        List<Player> listPlayers = new List<Player>();

        for(int i = 0; i < 10; i++) {
            Player player = new Player();
            player._Name = i.ToString();
            player._Level = i;
            player._Exp = i * 10;

            listPlayers.Add(player);
        }

        //쓰기
        FileStream fsw = new FileStream(fileName, FileMode.Create);

        BinaryFormatter bfW = new BinaryFormatter();
        bfW.Serialize(fsw, listPlayers);

        fsw.Close();


        //읽기
        FileStream fsr = new FileStream(fileName, FileMode.Open);

        BinaryFormatter bfr = new BinaryFormatter();
        List<Player> readPlayers = (List<Player>)bfr.Deserialize(fsr);

        foreach(var data in readPlayers) {
            Console.WriteLine("_Name: {0} _Level:{1} _Exp:{2}", data._Name, data._Level, data._Exp);
        }

        fsr.Close();
    }
}

 이전 예제와 다를 것이 없다. Desirialize()수행 할때 원래의 type으로 캐스팅해여 사용한다.

반응형

'프로그래밍 이야기 > GameDev' 카테고리의 다른 글

[게임이론] Vector  (0) 2020.12.15
[게임이론] 삼각함수  (0) 2020.12.10
[C# 코딩연습] 임의의 성적표. 성적 추출  (0) 2020.12.04
[C#] Lamda, Func, Action  (0) 2020.11.29
[C#] Delegate, Event  (0) 2020.11.26