【问题标题】:How to handle exception raised while doing json.net deserialisation on parameterised constructor如何处理在参数化构造函数上进行 json.net 反序列化时引发的异常
【发布时间】:2012-11-16 05:43:15
【问题描述】:

我正在使用 Json.net 4.5。我已经使用 Json 对 PatientV1 进行了序列化,并尝试将其除菌到 PatientV2 中。序列化发生得很好。

但是当我在AppUtility.CreatePatientNr 中引入了验证检查(如果传递了任何空值或空值,则会引发异常),反序列化失败。

我尝试使用派生的 JsonConverter 创建 PatientV2 对象,在该对象中我可以控制将“Proper”值传递给构造函数,但是在创建对象后我将无法设置正确的 PatientNr,因为它是只读。

我不想使用反射。 Json.net 是否提供任何方法来设置 JsonConverter 中的只读属性 patientV2.PatientNr

有什么方法可以忽略这个异常或任何其他方法来创建 PatientV2 对象?

    //version 1.0. Legacy code with no Json tag
    public class PatientV1
    {
        public int PatId { get; set; }
    }

    //Version 2.0
    public class PatientV2
    {
        public PatientV2( string Id, string s1, string s2 )
        {
            PatientNr = AppUtility.CreatePatientNr( Id, s1, s2);
        }

        //PatId is renamed to a string type. It now has private set
        [JsonProperty( "PatId" )]
        public string PatientNr { get; private set; }
    }

Edit1: Json 是否有任何特定的反序列化构造函数,就像二进制序列化一样?

【问题讨论】:

  • 为什么不在构造函数中尝试/捕获AppUtility.CreatePatientNr 调用?
  • 在我的正常使用中,我希望引发异常,因此如果未将正确的值传递给构造,则不应创建该对象。将参数验证代码移到构造函数之外将需要对所有这些类似的类进行更多的努力,因此试图找出一种更好的简单方法

标签: c# .net serialization json.net


【解决方案1】:

Json 首先使用默认构造函数尝试对象,如果找不到,则使用第一个参数化构造函数并将空数据传递给它。 Json 没有像二进制序列化一样用于构造对象的特定构造函数。

但是,如果您有实现 ISerializable 的对象,则调用序列化构造函数。

可以使用的方法如下

  1. 在 JsonConverter 中通过传递适当的值来创建对象 参数化构造函数
  2. 从构造函数中删除可能引发 例外。
  3. 将所有可持久化的结构简单化为没有任何结构的结构 业务逻辑(贫血模型)

我目前将采用方法 1) 然后 2) 稍后 3)。由于遗留大量代码原因,方法 2) 和 3) 需要一些时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多