c# - 如何使用 JIL 通过参数化构造函数反序列化类型?

标签 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; }
}

然后我进行一个简单的串行反序列化:

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 流中遇到的每个成员。如果没有默认构造函数,就不可能创建空对象。

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

关于c# - 如何使用 JIL 通过参数化构造函数反序列化类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35631019/

相关文章:

c# - 使用 JavaScript 更改文本框的显示时 Ajax requiredFieldValidator 弹出

C# 获取 SelectedDate.Day 字符串值并将其绑定(bind)到 gridview

c# - 在 C# 中查看一个字符串是否包含另一个字符串的最快、不区分大小写的方法是什么?

c# - 为什么 SQLite 插入会非常慢? (使用的交易)

php - 使用 php 和 mysql 存储和检索多维数组

c# - 使用 Linq 返回查询中的项目数及其结果集

c# - [WPF]如何在 Canvas 上绘制网格?

.net - .NET 3.5 中的 SmtpClient SendAsync

python - 我编写的二进制 PLY 文件导致 meshlab 崩溃

xml - 是否有支持泛型的 Delphi 对象序列化库?