본문 바로가기

2018/06

[C#] BinaryFormatter / XmlSerializer / DataContractJsonSerializer C#에서는 문자열이나 정수와 같은 타입의 데이터를 byte배열로 변환하는 직렬화를 수행할 수 있으며 물론 그 반대로 가능합니다. 그렇다면 기본 데이터타입이 아닌 직접 만든 클래스와 같은 요소는 어떻게 직렬화를 수행할 수 있을까? System.Runtime.Serialization.Formatters.Binary.BinaryFormatter가 그 답이 될 수 있습니다. 예를 들어 아래와 같은 클래스가 있습니다. class Employee { public Employee(string name, string department, int level) { Name = name; Department = department; Level = level; } public string Name { get; set; } p.. 더보기
[C#] Encoding / BitConverter 컴퓨터는 내부적으로 데이터를 숫자로 처리합니다. A, B, C와 같은 문자도 마찬가지입니다. 그럼 시스템은 내부적으로 문자를 처리하기 위해 숫자로 표현해야 하는데 이 과정을 인코딩(Encoding)이라고 합니다. 다만 특정 문자를 표현하기 위해 내부적으로 문자를 어떤 숫자로 처리해야 하는가가 정해져야 하며 이를 정리한 코드체계중 대표적으로 ASCII코드가 있습니다. ASCII코드는 A를 65, B를 66... 으로 표현합니다. 하지만 ASCII코드는 7bit를 기반으로 하기에 영문자나 숫자, 일부특수문자만을 표현할 수 있을뿐 한글, 한자, 일어와 같은 문자는 표현할 수 있는 방법이 없습니다. 그래서 대한민국은 한글표현을 위해 EUC-KR, CP949, KS_C_5601-1987등의 인코딩방식을 만들게 되.. 더보기
[C#] fixed unsafe 영역안에서 포이터를 사용하는건 스택으로 데이터를 저장하는 값형식의 변수에서만 가능합니다. 참조형식의 변수에서 포인터를 사용할 수 없는 이유는 참조형식의 데이터는 힙에 할당되고 힙은 가비지 컬렉터에 의해 위치가 바뀔 수 있기 때문입니다. 결국 참조형식의 주소를 갖고 있던 포인터는 언제라도 전혀 엉뚱한 곳을 가리킬 수 있기 때문입니다. fixed는 힙에 할당된 참조 형식의 인스턴스를 가비지 컬렉터가 건드리지 못하게 하여 위에서 말한 문제를 해결할 수 있도록 합니다. static void Main() { unsafe { string s = "abcdefg"; fixed (char* c = s.ToCharArray()) { for (int i = 0; i < s.Length; i++) Console.. 더보기