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

时间:2016-02-25 15:05:58

标签: c# .net serialization deserialization jil

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

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

    public DateTimeOffset TimeStamp { get; }    
    public string Name { get; }
}

然后我做了一个简单的ser-deserialization:

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”:“/日期(1456412550349 + 0000)/”,“姓名”:“Mr Right”}

但反序列化会引发任何想法如何修复它? JIL是否支持使用参数化构造函数对类型进行反序列化?

1 个答案:

答案 0 :(得分:3)

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

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

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