使用服务堆栈反序列化的问题

时间:2015-12-01 12:03:25

标签: c# json serialization servicestack servicestack.redis

我在使用servicestack从redis中获取对象列表时遇到问题。错误是'类型定义应以' {'阵列....'

using (var redis = _redisService.GetClient())
{
     redis.Set(key, myListOfThings.SerializeToString());
}

似乎是缓存中有效的formattable JSON:

[{"id":34,"someid":1012,"stuff":"blah"},{"id":33,"someid":1012,"stuff":"dfsfd"}]

但是我在检索时遇到错误:

using (var redis = _redisService.GetClient())
{
     return redis.Get<List<MyThing>>(key);
}
  

&#34;其他信息:类型定义应以&#39; {&#39;开头   期待序列化类型&#39; MyThing&#39;,得到字符串开头:[my   来自缓存的json字符串]&#34;

我甚至将它包装起来,以便列表是主要对象的子代,这使得JSON以&#39; {&#39;但我仍然有同样的错误...

我也尝试反序列化到一个数组,以及各种反序列化的方法,但都在servicestack库中,

有什么想法吗?

为其他人编辑信息

GetValue方法应该与SetValue一起使用,而不是Set,因为它的编码方式。我仍然不知道为什么使用某种类型不会反序列化。

redis.Get<DataResponse>(key);

这种方法似乎可以解决问题:

redis.Get<string>(key).FromJson<DataResponse>()

1 个答案:

答案 0 :(得分:0)

您的API使用不平衡:

如果您自己序列化POCO并将POCO保存为字符串,则应将值检索为字符串并自行反序列化,例如:

redis.SetValue(key, myListOfThings.ToJson());
var dtos = redis.GetValue(key).FromJson<List<MyThing>>();

如果您想让Redis客户端序列化它,那么您应该使用等效类型的API来代替它,例如:

redis.Set(key, myListOfThings);
var dtos = redis.Get<List<MyThing>>(key);