首页 > 解决方案 > 有没有办法检查 ac# 类是否是 json 可序列化和可反序列化的

问题描述

我有一个包含大约 200 个类的项目,这些类需要保存为 json 并在以后反序列化。所有类都是不可变的,因此我需要将所有复杂类型注入构造函数,否则反序列化不起作用。因为我使用 Clonable 基类,所以我不会初始化构造函数中的每个参数。当我忘记向构造函数添加单个类或拼写错误时,反序列化不再起作用,我知道检查的唯一方法是使用示例数据编写大量单元测试。

这是重现我的问题的示例:

static void Main(string[] args)
{
    var immutableClass = new ImmutableClass(new OtherImmutableClass(2)).WithAnyProperty(1);
    var jsonString = JsonConvert.SerializeObject(immutableClass, Formatting.Indented);
    var deserializedObject = JsonConvert.DeserializeObject<ImmutableClass>(jsonString);
}

public class ImmutableClass : Clonable<ImmutableClass>
{
    public ImmutableClass(OtherImmutableClass otherImmutableClassInstance)
    {
        OtherImmutableClassInstance = otherImmutableClassInstance;
    }

    public OtherImmutableClass OtherImmutableClassInstance { get; }

    [JsonProperty]
    public int AnyProperty { get; private set; }

    public ImmutableClass WithAnyProperty(int newValue)
    {
        return With(s => s.AnyProperty = newValue);
    }
}

public class OtherImmutableClass
{
    public OtherImmutableClass(int completelyWrongPropertyName)
    {
        MyProperty = completelyWrongPropertyName;
    }

    public int MyProperty { get; }
}

public abstract class Clonable<T> where T : Clonable<T>
{
    protected T With(Action<T> updateAction)
    {
        var clone = (T)MemberwiseClone();
        updateAction(clone);
        return clone;
    }
}

序列化后,我的 jsonString 的内容符合预期:

{
  "OtherImmutableClassInstance": {
    "MyProperty": 2
  },
  "AnyProperty": 1
}

当我反序列化时,没有抛出异常,但是MyProperty是 0 而不是 2 completelyWrongPropertyNameMyProperty因为OtherImmutableClass.

有没有一种简单的方法来检查我的模型是否可序列化和可反序列化,而无需为每个类编写 UnitTests?

我正在寻找类似的东西JsonChecker<ImmutableClass>.CanSerializeAndDeserialize();

我已经问过谷歌但没有找到解决方案。

标签: c#.netjson.net.net-framework-4.8

解决方案


推荐阅读