다음을 통해 공유


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 샘플을 기반으로 합니다.

사용자 형식에 대한 데이터 계약을 정의하려면

  1. Person를 클래스에 연결하고 DataContractAttribute 특성을 serialize할 멤버에 연결하여 DataMemberAttribute에 대한 데이터 계약을 정의합니다. 데이터 계약에 대한 자세한 내용은 서비스 계약 디자인를 참조하세요.

    [DataContract]
    internal class Person
    {
        [DataMember]
        internal string name;
    
        [DataMember]
        internal int age;
    }
    

형식 Person의 인스턴스를 JSON으로 serialize하려면

참고 항목

서버에서 나가는 회신을 직렬화하는 동안 오류가 발생하거나 다른 이유로 오류가 발생하면 클라이언트에 오류로 반환되지 않을 수 있습니다.

  1. Person 형식의 인스턴스를 만듭니다.

    var p = new Person();
    p.name = "John";
    p.age = 42;
    
  2. DataContractJsonSerializer를 사용하여 Person 개체를 메모리 스트림으로 직렬화합니다.

    var stream1 = new MemoryStream();
    var ser = new DataContractJsonSerializer(typeof(Person));
    
  3. WriteObject 메서드를 사용하여 JSON 데이터를 스트림에 씁니다.

    ser.WriteObject(stream1, p);
    
  4. JSON 출력을 표시합니다.

    stream1.Position = 0;
    var sr = new StreamReader(stream1);
    Console.Write("JSON form of Person object: ");
    Console.WriteLine(sr.ReadToEnd());
    

JSON에서 형식 Person의 인스턴스를 역직렬화하려면

  1. PersonReadObject 메서드를 사용하여 JSON 인코딩된 데이터를 DataContractJsonSerializer의 새 인스턴스로 역직렬화합니다.

    stream1.Position = 0;
    var p2 = (Person)ser.ReadObject(stream1);
    
  2. 결과를 표시합니다.

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

참고 항목