Json.NET은 사용자 정의 getter 및 변경 불가능한 유형으로 속성을 역 직렬화하지 않습니다.

안톤 톨 스토 프

내 클래스의 직렬화를 위해 Newtonsoft.Json (일명 Json.Net)을 사용하고 있습니다.

public class ClassWithCustomProperty
{
    private ImmutableValue value;
    public ImmutableValue Value
    {
        get => value = (value ?? new ImmutableValue(0));
        set => this.value = value;
    }
}

public class ImmutableValue
{
    public readonly int Value;
    public ImmutableValue(int value) => Value = value;
}

그러나 개체를 직렬화 및 역 직렬화 할 때 예상 값을받지 못합니다.

public static class Program
{
    public static void Main()
    {
        var json = JsonConvert.SerializeObject(new ClassWithCustomProperty
        {
            Value = new ImmutableValue(42)
        });
        // JSON is {"Value": {"Value": 42}} as expected

        var obj = JsonConvert.DeserializeObject<ClassWithCustomProperty>(json);
        Console.WriteLine(obj.Value?.Value); 
        // But after deserialization obj.Value.Value is 0, instead of 42
    }
}

무엇이 잘못되었거나이 동작을 변경하는 방법은 무엇입니까?

ImmutableValue자체적으로 직렬화 및 역 직렬화하면 제대로 작동 한다는 것을 알았 습니다.

var json = JsonConvert.SerializeObject(new ImmutableValue(42));
var obj = JsonConvert.DeserializeObject<ImmutableValue>(json);
Console.WriteLine(obj.Value);  // 42
브라이언 로저스

범인은 ClassWithCustomProperty수업의 다음 줄입니다 .

    get => value = (value ?? new ImmutableValue(0));

Json.Net의 기본 동작은 기존 객체를 대체하는 대신 재사용하는 것입니다. 따라서 ImmutableValueon 을 deserialize 할 때가 ClassWithCustomProperty되면 serializer는 먼저 기존 값이 있는지 확인합니다. 접근 자 (위)는 존재하지 않는다는 것을 발견 0하여 serializer에 반환되는 value를 가진 하나를 생성 합니다. 그런 다음 serializer는이 기존 개체를 다시 사용하려고 시도하지만 읽기 전용이므로 값을 설정할 방법이 없습니다 42. 따라서 값은 0으로 유지됩니다.

ObjectCreationHandling이 동작을 변경하는 데 사용할 수 있는 설정이 있습니다. 로 설정 Replace하면 원하는 방식으로 작동합니다. 다음과 같이 시도하십시오.

var settings = new JsonSerializerSettings 
{ 
    ObjectCreationHandling = ObjectCreationHandling.Replace 
};
var obj = JsonConvert.DeserializeObject<ClassWithCustomProperty>(json, settings);

바이올린 : https://dotnetfiddle.net/UVDMsL

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관