ServiceStack 的 JsonSerializer 可以序列化私有成员吗?
Posted
技术标签:
【中文标题】ServiceStack 的 JsonSerializer 可以序列化私有成员吗?【英文标题】:Can ServiceStack's JsonSerializer serialize private members? 【发布时间】:2013-08-31 21:30:19 【问题描述】:我主要关心的是 ServiceStack 的 Redis 客户端。我有一堆要存储在缓存中的实体。它们的成员大多是封装的(私有的),其中一些没有任何公共访问器。 ServiceStack 的序列化程序是否允许我在 Redis 中存储(并且很明显地获取)这些实体?或者我是否必须创建具有公共属性的“干净” POCO 类以进行序列化,这将迫使我维护任何实体的 2 个表示:一个真实的,以及它的“假” POCO 表示以将其存储在 Redis 中?
我希望答案不是后者:)
【问题讨论】:
【参考方案1】:根据设计,答案是后者。 ServiceStack 推广message-based design。有很多advantages to keeping your request/response DTO classes separate and single-purpose。 ServiceStack.Text JSON 序列化程序是 designed to serialize public properties,而不是公共或私有字段或私有属性。
【讨论】:
【参考方案2】:public static string SerializeObject(object obj, BindingFlags membersType)
var typeConfigType = typeof(TypeConfig<>).MakeGenericType(obj.GetType());
var prop = typeConfigType.GetMembers(BindingFlags.Public | BindingFlags.Static).FirstOrDefault(item => item.Name == "Fields") as PropertyInfo;
prop.SetValue(null, obj.GetType().GetFields(membersType), null);
prop = typeConfigType.GetMembers(BindingFlags.Public | BindingFlags.Static).FirstOrDefault(item => item.Name == "Properties") as PropertyInfo;
prop.SetValue(null, new PropertyInfo[0], null);
return JsonSerializer.SerializeToString(obj);
【讨论】:
以上是关于ServiceStack 的 JsonSerializer 可以序列化私有成员吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ServiceStack 5.0 项目中使用来自 ServiceStack 4.0 的服务模型?
具有模式的 ServiceStack IRedisClient ScanAllKeys 未按预期返回结果 (ServiceStack 5.7.0)
哪个 Canoe 版本与链接中为 REDIS 客户端实现提供的 soln 兼容 https://github.com/ServiceStack/ServiceStack.Redis