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;
}
}
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;
}
}