【问题标题】:ServiceStack Deserializing Interface property null in object对象中的 ServiceStack 反序列化接口属性 null
【发布时间】:2016-10-17 14:21:57
【问题描述】:

我想使用 ServiceStack JsonSerializer。

我在序列化我的对象之前将 IncludeTypeInfo 属性设置为 true。我的序列化字符串包含所有类型信息,如 "__type":".Interfacesb,....

当我想反序列化字符串时,我的接口属性为 null,即使我的序列化字符串中有类型信息。反序列化对象时是否需要任何其他配置。

我使用两种方法 JsonSerializer.SerializeToStringJsonSerializer.DeSerializeFromString

例子:

JsConfig.IncludeTypeInfo = true;

Public Class MyObject
{
Public string a{get;set;}
Public interface  b{get;Set;}
}

【问题讨论】:

  • 能否提供完整的代码示例以便我检查?您使用的是哪个版本的服务堆栈?
  • 我使用 3.9,我的代码块就像我序列化包含接口的类并将其反序列化回来

标签: servicestack servicestack-text


【解决方案1】:

首先,版本 4.* 是继续开发的版本。 3.9 没有人积极维护。

在 servicestack.text 4.50 上测试

其次,我认为这个属性并不是为了将其反序列化为实际对象。

我在 4.50 中做了同样的事情,只是没有反序列化:

替代解决方案

如果您想要来自 json 的类型,您可以在此处阅读:https://stackoverflow.com/a/21603948/1275832

当你有类型时:

我使用以下代码作为替代解决方案(注意它是一种扩展方法)作为运行时动态类型 (v4.50) 的解决方案:

public static object FromJson(this string json, Type deserializeType)
{
    return typeof(JsonSerializer).GetMethod("DeserializeFromString", BindingFlags.Static)
        .MakeGenericMethod(deserializeType)
        .Invoke(null, new[] { json });
}

用法为:var object = (MyInterface)jsonString.FromJson(Type.GetType(AssemblyQualifiedNameString));

【讨论】:

  • 我发现了我的问题,我有一个只读属性,没有设置方法它不是反序列化的。第二点我将我的属性类型接口更改为对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多