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)

ServiceStack:添加 Blazor 支持?

哪个 Canoe 版本与链接中为 REDIS 客户端实现提供的 soln 兼容 https://github.com/ServiceStack/ServiceStack.Redis

ServiceStack.OrmLite 调用存储过程

解决ServiceStack.Redis的6000次限制问题