Home Full Site
DataContractJsonSerializer : WCF에서의 JSON 사용

WCF 서비스는 클라이언트와의 통신에서 JSON 변환을 자동으로 제공한다. WCF는 옵션에 따라 데이타를 XML 혹은 JSON으로 전달하는데, WCF 서버 코드에서 JSON으로 ResponseFormat이 설정된 경우 (ResponseFormat = WebMessageFormat.Json), 별도의 JSON 코드를 넣어줄 필요는 없다. 하지만 어떤 경우는 개발자 직접 JSON을 핸들링할 필요가 있는데, 이 경우 DataContractJsonSerializer 클래스를 사용할 수 있다. DataContractJsonSerializer 클래스는 본래 WCF를 위해 만들어 졌지만, System.Runtime.Serialization.dll 을 참조하면 WinForms 이나 WPF 등의 일반 C# 프로그램에서도 사용할 수 있다. 하지만 DataContractJsonSerializer 는 JavaScriptSerializer 보다 약간 더 많은 코딩을 해주어야 한다. 아래는 DataContractJsonSerializer를 사용하여 .NET 객체를 JSON으로 변환하고 이를 다시 복원하는 예제이다.

예제

using System.IO;
namespace jsonApp
{
    // 1. System.Runtime.Serialization.dll 참조
    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;

    class JsonUsingDataContractJsonSerializer // WCF
    {
        public void DoTest()
        {
            // 2. JSON string 만들기
            var p = new Person2 { Id = 1, Name = "Alex" };

            DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(Person2));
            MemoryStream mem = new MemoryStream();

            // Memory에 Person2 객체가 Serialize 되어 저장됨
            // 이 메모리스트림은 네트워크나 디스크에 전송
            js.WriteObject(mem, p);

            // 메모리스트림으로부터 JSON string을 만들 경우는:
            string jsonString = string.Empty;
            mem.Position = 0; // 중요!
            using (StreamReader sr = new StreamReader(mem))
            {
                jsonString = sr.ReadToEnd();
                System.Diagnostics.Debug.WriteLine(jsonString);
            }

            // 3. JSON string으로부터 Object 가져오기
            using (MemoryStream memJs = new MemoryStream())
            {
                using (StreamWriter wr = new StreamWriter(memJs))
                {
                    wr.Write(jsonString);
                    wr.Flush();
                    memJs.Position = 0;
                    Person2 pObj = (Person2)js.ReadObject(memJs);
                    System.Diagnostics.Debug.WriteLine(pObj.Name);
                }                
            }
        }
    }

    [DataContract]
    class Person2
    {
        [DataMember]
        public int Id;
        [DataMember]
        public string Name;
    }
}



© csharpstudy.com