如何使用 JIL 反序列化带有参数化构造函数的类型?
How to Deserialize a type with a Parameterized Constructor using 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
是否支持使用参数化构造函数对类型进行反序列化?
正如您所注意到的,Jil 不支持没有无参数构造函数的反序列化类型*。这是因为没有完全可靠的方法将参数映射到构造函数到 public 成员(字段和属性)。
当 Jil 反序列化时,它会创建一个给定类型的空对象,然后设置它在 JSON 流中遇到的每个成员。没有默认构造函数就无法创建空对象。
*这有两个例外,匿名类型和原始包装类型。匿名类型在参数和成员之间具有语言定义的映射,并且 primitive wrapper 类型是单参数(和选择加入)——这两种情况都是可解析的,而一般情况则不是。
我有一个简单的不可变 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
是否支持使用参数化构造函数对类型进行反序列化?
正如您所注意到的,Jil 不支持没有无参数构造函数的反序列化类型*。这是因为没有完全可靠的方法将参数映射到构造函数到 public 成员(字段和属性)。
当 Jil 反序列化时,它会创建一个给定类型的空对象,然后设置它在 JSON 流中遇到的每个成员。没有默认构造函数就无法创建空对象。
*这有两个例外,匿名类型和原始包装类型。匿名类型在参数和成员之间具有语言定义的映射,并且 primitive wrapper 类型是单参数(和选择加入)——这两种情况都是可解析的,而一般情况则不是。