내 클래스의 직렬화를 위해 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의 기본 동작은 기존 객체를 대체하는 대신 재사용하는 것입니다. 따라서 ImmutableValue
on 을 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);
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다