Как десериализовать тип с помощью параметризованного конструктора, используя 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) - оба случая разрешимы, в то время как общий случай - нет.

Другие вопросы по тегам