【发布时间】:2016-01-18 12:36:11
【问题描述】:
我正在使用 Newtonsoft json.net 序列化程序将我的一些模型序列化为 json。
其中一些是复杂的包含循环引用。由于循环引用不可序列化,因此通过设置ReferenceLoopHandling = ReferenceLoopHandling.Ignore 处理这些引用。
在使用 ISupportInitialize 进行其他序列化后恢复引用。
ISupportInitialize 还用于从数据库初始化重属性(图像)。有些类没有默认 ctor(需要 [NotNull] 参数),我知道我的重属性可能是惰性的,但由于我的 ISupportInitialize 与以前的序列化程序一起工作正常(并且经过测试),我更愿意使用该机制。
我正在尝试让 json.net 序列化程序检测实现 ISupportInitialize 接口的类型并调用适当的接口方法。当实际的序列化/反序列化对象实现接口时,这很简单,但当对象图中的某些属性实现它时,这更难(或者至少对我来说不直观)。我试过写一个自定义转换器,但没有运气。下面是我想要完成的一个简单示例
public class SupportsInitialize : ISupportInitialize
{
public void BeginInit(){throw new NotImplementedException();}
public void EndInit(){throw new NotImplementedException();}
}
[Test]
public void MakeSerializerCallBeginAndEndInit()
{
var supportsInitialize = new ToBeSerialized() {SupportsInitialize = new SupportsInitialize()};
// before serializing any property implementing ISupportInitialize (ToBeSerialized.SupportsInitialize in this case) its BeginInit should be called
var json = JsonConvert.SerializeObject(supportsInitialize);
// after deserializing any property implementing ISupportInitialize its EndInit should be called
var deserialized = JsonConvert.DeserializeObject<ToBeSerialized>(json);
}
public class ToBeSerialized
{
public SupportsInitialize SupportsInitialize { get; set; }
}
感谢您为我指明正确方向的任何帮助
【问题讨论】:
标签: c# json serialization json.net