티스토리 뷰

C#

[BaseClassLibrary]직렬화/역직렬화

란텔 2014. 12. 5. 20:54

프로그래밍에서 다뤄지는 모든데이터는 결국 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]특성을 부여해야 합니다.

- 이진 데이터로 객체를 직렬화하기 때문에 속도면에서 성능이 좋습니다.





Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday