我有一个Delphi和.NET都知道的COM接口。 .NET和Delphi类都实现了这个接口。
我在反序列化期间使用Converter,并且能够检测要实例化的类是.net还是delphi类。
Delphi课程一切正常。 但是,如果需要对.NET类进行实例化,我需要能够创建并填充.NET对象。
请参阅下面的代码段。
class DelphiTypesJsonConverter : Newtonsoft.Json.JsonConverter
{
private const string XMLKEY = "__XML";
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObject = JObject.Load(reader);
var xmlBlob = jObject.GetValue(XMLKEY);
if (xmlBlob != null)
{
var delphiObject = CreateDelphiCOMObject(xmlBlob);// Object will be created in Delphi. This works!
return delphiObject;
}
// The implementing class is a .NET class
// Just proceed with the default behaviour based on the $type identifier.
// How can I now create the type that would have been created if this converter would have not been executed.
return ????;
}
}
修改
与此同时,我发现了呼叫
return serializer.Deserialize(reader);
完全返回我需要的东西。但这只有在我没有打电话时才有效:
JObject.Load(reader);
之前。 但我需要调用JObject.Load(reader)来确定是否处理Delphi或.NET对象。 越来越近了......
答案 0 :(得分:0)
以下作品。花了好几个小时。
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jToken = JToken.Load(reader);
if (jToken.HasValues)
{
var xmlBlob = jToken[XMLKEY];
if (jToken.First.Path == XMLKEY)
{
var delphiObject = CoreFactory.CrossPlatformProperties.DeserializeDelphiObject(xmlBlob.Value<string>());
return delphiObject;
}
}
return serializer.Deserialize(jToken.CreateReader());
}