Как десериализовать тип с помощью параметризованного конструктора, используя JIL?
У меня есть простой неизменный POCO, определяемый как:
public sealed class Person
{
public Person(string name)
{
Name = name;
TimeStamp = DateTimeOffset.UtcNow;
}
public DateTimeOffset TimeStamp { get; }
public string Name { get; }
}
Затем я делаю простую сер-десериализацию:
var p = new Person("Mr Right").Dump();
var ser = JSON.Serialize(p).Dump();
// Throws Deserialization Exception, Error occured building a deserializer,
// Expected a parameterless constructor...
JSON.Deserialize<Person>(ser).Dump();
Сериализация успешно производит:
{"TimeStamp": "/ Date (1456412550349 + 0000) /", "Name": "Mr Right"}
Но отбрасывает десериализацию, есть идеи как это исправить? Есть ли JIL
поддерживать десериализацию типов с помощью параметризованных конструкторов?
1 ответ
Как вы заметили, Jil не поддерживает десериализацию типов без конструкторов без параметров *. Это связано с тем, что не существует абсолютно надежного способа сопоставления параметров конструктору с открытыми членами (полями и свойствами).
Когда Jil десериализуется, он создает пустой объект данного типа, а затем устанавливает каждый элемент, с которым он сталкивается, в потоке JSON. Создание пустого объекта невозможно без конструктора по умолчанию.
* Есть два исключения: анонимные типы и типы примитивных оболочек. Анонимные типы имеют определяемое языком отображение между параметрами и членами, а примитивные типы- обертки являются однопараметрическими (и opt-in) - оба случая разрешимы, в то время как общий случай - нет.