DataContractJsonSerializer를 사용하는 방법
참고 항목
이 문서는 DataContractJsonSerializer에 대한 것입니다. JSON 직렬화 및 역직렬화와 관련된 대부분의 시나리오에서는 System.Text.Json 네임스페이스의 API를 사용하는 것이 좋습니다.
JSON(JavaScript Object Notation)은 클라이언트 브라우저 및 AJAX 사용 웹 서비스 간에 소량의 데이터를 신속하게 교환할 수 있는 효율적인 데이터 인코딩 형식입니다.
이 문서에서는 .NET 형식 개체를 JSON 인코딩된 데이터로 직렬화한 다음 JSON 형식의 데이터를 다시 .NET 형식의 인스턴스로 역직렬화하는 방법을 보여 줍니다. 이 예에서는 데이터 계약을 사용하여 사용자 정의 Person
형식의 serialization 및 deserialization을 보여 주고 DataContractJsonSerializer를 사용합니다.
일반적으로 JSON serialization 및 deserialization는 AJAX 사용 엔드포인트를 통해 노출되는 서비스 작업에서 데이터 계약 형식을 사용하는 경우 WCF(Windows Communication Foundation)에서 자동으로 처리됩니다. 그러나 경우에 따라 JSON 데이터로 직접 작업해야 할 수도 있습니다.
이 문서는 DataContractJsonSerializer 샘플을 기반으로 합니다.
사용자 형식에 대한 데이터 계약을 정의하려면
Person
를 클래스에 연결하고 DataContractAttribute 특성을 serialize할 멤버에 연결하여 DataMemberAttribute에 대한 데이터 계약을 정의합니다. 데이터 계약에 대한 자세한 내용은 서비스 계약 디자인를 참조하세요.[DataContract] internal class Person { [DataMember] internal string name; [DataMember] internal int age; }
형식 Person의 인스턴스를 JSON으로 serialize하려면
참고 항목
서버에서 나가는 회신을 직렬화하는 동안 오류가 발생하거나 다른 이유로 오류가 발생하면 클라이언트에 오류로 반환되지 않을 수 있습니다.
Person
형식의 인스턴스를 만듭니다.var p = new Person(); p.name = "John"; p.age = 42;
DataContractJsonSerializer를 사용하여
Person
개체를 메모리 스트림으로 직렬화합니다.var stream1 = new MemoryStream(); var ser = new DataContractJsonSerializer(typeof(Person));
WriteObject 메서드를 사용하여 JSON 데이터를 스트림에 씁니다.
ser.WriteObject(stream1, p);
JSON 출력을 표시합니다.
stream1.Position = 0; var sr = new StreamReader(stream1); Console.Write("JSON form of Person object: "); Console.WriteLine(sr.ReadToEnd());
JSON에서 형식 Person의 인스턴스를 역직렬화하려면
Person
의 ReadObject 메서드를 사용하여 JSON 인코딩된 데이터를 DataContractJsonSerializer의 새 인스턴스로 역직렬화합니다.stream1.Position = 0; var p2 = (Person)ser.ReadObject(stream1);
결과를 표시합니다.
Console.WriteLine($"Deserialized back, got name={p2.name}, age={p2.age}");
예시
// Create a User object and serialize it to a JSON stream.
public static string WriteFromObject()
{
// Create User object.
var user = new User("Bob", 42);
// Create a stream to serialize the object to.
var ms = new MemoryStream();
// Serializer the User object to the stream.
var ser = new DataContractJsonSerializer(typeof(User));
ser.WriteObject(ms, user);
byte[] json = ms.ToArray();
ms.Close();
return Encoding.UTF8.GetString(json, 0, json.Length);
}
// Deserialize a JSON stream to a User object.
public static User ReadToObject(string json)
{
var deserializedUser = new User();
var ms = new MemoryStream(Encoding.UTF8.GetBytes(json));
var ser = new DataContractJsonSerializer(deserializedUser.GetType());
deserializedUser = ser.ReadObject(ms) as User;
ms.Close();
return deserializedUser;
}
참고 항목
JSON serializer는 다음 샘플 코드에서처럼 동일한 이름의 여러 멤버를 가진 데이터 계약에 대한 serialization 예외를 throw합니다.
[DataContract]
public class TestDuplicateDataBase
{
[DataMember]
public int field1 = 123;
}
[DataContract]
public class TestDuplicateDataDerived : TestDuplicateDataBase
{
[DataMember]
public new int field1 = 999;
}