티스토리 뷰
프로그래밍에서 다뤄지는 모든데이터는 결국 byte데이터 입니다.
프로그래밍 하시는 분들은 아시겠지만 1byte는 8개의 bit를 가지고 한개의 bit는 이진수로 1과 0의 값을 가집니다.
일련의 데이터를 바이트배열로 변환하는 작업을 직렬화, 다시 그 바이트배열을 원래 형태의 데이터로 복원하는 작업을 역직렬화라고 합니다.
System.BitConverter
BitConverter클래스는 getBytes함수를 통해 바이트 배열로 변환을 해줍니다. 다시 역직렬화를 위해서는 ToBoolean등의 함수를 사용하여 하면 됩니다.
byte[] ibytes = BitConverter.GetBytes(450000); byte[] bbytes = BitConverter.GetBytes(true); byte[] dbytes = BitConverter.GetBytes(45.12); bool b = BitConverter.ToBoolean(bbytes, 0); double d = BitConverter.ToDouble(dbytes, 0); int i = BitConverter.ToInt32(ibytes, 0); Console.WriteLine("{0},{1},{2}", i, b, d);
System.IO.MemoryStream
- MemoryStream은 Stream추상클래스를 상속받은 타입의 클래스입니다.
- Stream은 데이터를 입력하고/출력하는 통로 같은 곳으로 MemoryStream은 이름 그대로 메모리에 바이트 데이터를 쓰거나 읽는 작업을 합니다.
MemoryStream을 사용하여 기본형 데이터를 읽고 쓰는 코드 예
byte[] shortBytes = BitConverter.GetBytes((short)32000); //바이트 배열을 얻어온다. byte[] intBytes = BitConverter.GetBytes(1652300); //바이트 배열을 얻어온다. MemoryStream ms = new MemoryStream(); //스트림에 쓰기위해 MemoryStream 객체생성 ms.Write(shortBytes, 0, shortBytes.Length); ms.Write(intBytes, 0, intBytes.Length); ms.Position = 0; //스트림의 위치는 0이지만 데이터를 쓰게되면 위치가 증가한다. 다시 역직렬화를 위해서는 0으로 셋팅 byte[] sb = new byte[2]; //short형은 2바이트 값이니 2바이트 배열을 생성한다. ms.Read(sb, 0, sb.Length); //(바이트배열, 위치시작, 길이); short shortSb = (short)BitConverter.ToInt16(sb, 0); Console.WriteLine(shortSb);
System.IO.StreamWriter / System.IO.StreamReader
- 문자열을 스트림에 쉽게 쓰고 읽을 수 있도록 하기위해 만들어진 클래스입니다.
- 기존 MemoryStream만의 방식을 고집하면 Encoding클래스를 통한 byte타입 배열로의 변환 작업이 필요하지만 이 클래스를 사용하면 문자 데이터를 쉽게 읽고 쓸 수 있습니다.
MemoryStream ms = new MemoryStream(); StreamWriter writer = new StreamWriter(ms, Encoding.UTF8); writer.WriteLine("XX대학교"); writer.WriteLine("29살"); writer.WriteLine("프로그래머"); writer.Flush(); ms.Position = 0; StreamReader reader = new StreamReader(ms, Encoding.UTF8); string text = reader.ReadToEnd(); Console.WriteLine(text); //reader와 writer의 생성자의 두번째 인코딩 값은 일치해야 한다.
System.IO.BinaryWriter / System.IO.BinaryReader
- StreamReader/Writer가 문자열을 읽고 쓰는데 편리함을 가지고 있다면 이 클래스는 2진 데이터를 읽고 쓰는데 편리함을 가지고 있습니다.
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
- 사용자 정의 클래스를 직렬화하기 위하여 사용되는 클래스입니다.
- 이 클래스를 사용하기 위해서는 클래스에 [Serializable]특성을 부여해야 합니다.
- 이진 데이터로 객체를 직렬화하기 때문에 속도면에서 성능이 좋습니다.
'C#' 카테고리의 다른 글
?? 키워드와 goto문 (0) | 2015.05.29 |
---|---|
깊은 복사, 얕은 복사, ref, out 예약어 (0) | 2014.12.28 |
C# 예외처리 (0) | 2014.11.19 |
CLR(C#가상머신) 초기화시 값을 전달할 경우 app.config 활용 (0) | 2014.11.18 |
상수를 나타내는 const와 읽기 전용의 readonly키워드 (0) | 2014.08.27 |