我有一个大约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,因为completelyWrongPropertyName
与MyProperty
的构造函数中的OtherImmutableClass
不匹配。
是否有一种简单的方法来检查我的模型是否可序列化和可反序列化,而无需为每个类编写UnitTests?
我正在搜索类似JsonChecker<ImmutableClass>.CanSerializeAndDeserialize();
我已经问过Google,但找不到解决方法。