如何使用 JIL 反序列化具有参数化构造函数的类型

本文关键字:构造函数 类型 参数 何使用 JIL 反序列化 | 更新日期: 2023-09-27 18:36:15

我有一个简单的不可变POCO,定义为:

public sealed class Person
{
    public Person(string name)
    {
        Name = name;
        TimeStamp = DateTimeOffset.UtcNow;
    }
    public DateTimeOffset TimeStamp { get; }    
    public string Name { get; }
}

然后我做一个简单的 ser-反序列化:

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是否支持使用参数化构造函数对类型进行反序列化?

如何使用 JIL 反序列化具有参数化构造函数的类型

如您所注意的,Jil 不支持在没有无参数构造函数*的情况下反序列化类型。 这是因为没有完全可靠的方法可以将参数映射到构造函数到公共成员(字段和属性)。

当 Jil 反序列化时,它会创建一个给定类型的空对象,然后设置它在 JSON 流中遇到的每个成员。 如果没有默认构造函数,则无法创建空对象。

*有两个例外,匿名类型和基元包装器类型。 匿名类型在参数和成员之间具有语言定义的映射,基元包装器类型是单参数(和选择加入) - 这两种情况都是可解析的,而一般情况则不是。