该项目是一个 Asp.Net Web API Web 服务。
我有一个类型层次结构,我需要能够序列化到 Json 和从 Json 序列化,所以我从这个 SO 中获取代码:如何在 JSON.NET 中实现自定义 JsonConverter 以反序列化基类对象列表?,并将转换器应用于我的层次结构的基类;像这样的东西(这里有伪代码来隐藏不相关的内容):
[JsonConverter(typeof(TheConverter))]
public class BaseType
{
// note the base of this type here is from the linked SO above
private class TheConverter : JsonCreationConverter<BaseType>
{
protected override BaseType Create(Type objectType, JObject jObject)
{
Type actualType = GetTypeFromjObject(jObject); /*method elided*/
return (BaseType)Activator.CreateInstance(actualType);
}
}
}
public class RootType
{
public BaseType BaseTypeMember { get; set; }
}
public class DerivedType : BaseType
{
}
因此,如果我反序列化一个等于 的实例的实例RootType
,那么它将被反序列化回该类型的实例。BaseTypeMember
DerivedType
作为记录,这些 JSON 对象包含一个'$type'
包含虚拟类型名称(不是完整的 .Net 类型名称)的字段,因此我可以同时支持 JSON 中的类型,同时准确控制可以序列化和反序列化的类型。
现在这对于反序列化请求中的值非常有效;但我对序列化有疑问。如果您查看链接的 SO,实际上是从顶部答案链接的 Json.Net 讨论,您会发现我使用的基本代码完全针对反序列化;其使用示例显示了手动创建序列化程序。由此JsonConverter
带来的实现JsonCreationConverter<T>
只是简单地抛出一个NotImplementedException
.
现在,由于 Web API 对请求使用单个格式化程序的方式,我需要在WriteObject
方法中实现“标准”序列化。
在这一点上,我必须强调,在开始我的项目的这一部分之前,我已经正确地序列化了所有内容而没有错误。
所以我这样做了:
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
但是当其中一个对象被序列化时,我得到一个JsonSerializationException
: 。Self referencing loop detected with type 'DerivedType'
再次 - 如果我删除转换器属性(禁用我的自定义创建),那么它工作正常......
我有一种感觉,这意味着我的序列化代码实际上是在同一个对象上再次触发转换器,这又会再次调用序列化程序 - 令人作呕。已确认 - 请参阅我的答案
那么我应该编写什么代码来WriteObject
执行相同的“标准”序列化?