반응형
데이터를 파일에 저장할 때 저장 값들을 규격화하여 쓰고 읽어보자. 이에 대해 다음의 단계를 거친다.
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 |