Виновной является эта строка в вашем ClassWithCustomProperty
классе:
get => value = (value ?? new ImmutableValue(0));
Поведение Json.Net по умолчанию состоит в том, чтобы повторно использовать существующие объекты, а не заменять их. Поэтому, когда пришло время десериализовать ImmutableValue
на ClassWithCustomProperty
, сериализатор сначала проверяет, существует ли существующее значение. Метод доступа (см. Выше) обнаруживает, что его нет, поэтому он создает значение со значением 0
, которое возвращается сериализатору. Затем сериализатор пытается повторно использовать этот существующий объект, но, поскольку он доступен только для чтения, невозможно установить для него значение 42
. Таким образом, значение остается нулевым.
Существует настройка ObjectCreationHandling
, которую можно использовать для изменения этого поведения. Если вы установите его на Replace
, он будет работать так, как вы хотите. Попробуйте так:
var settings = new JsonSerializerSettings
{
ObjectCreationHandling = ObjectCreationHandling.Replace
};
var obj = JsonConvert.DeserializeObject<ClassWithCustomProperty>(json, settings);
Скрипка: https://dotnetfiddle.net/UVDMsL