【问题标题】:ServiceStack and JSV: When I serialize a Dictionary<string, object> the type of 'object' is lost on deserializationServiceStack 和 JSV:当我序列化 Dictionary<string, object> 时,“对象”的类型在反序列化时会丢失
【发布时间】:2013-12-31 19:01:51
【问题描述】:

在我坚持使用 OrmLite 的 POCO 对象中,我具有以下属性:

....
public Dictionary<string, object> CustomData { get; set; }
...

这个属性是用数据填充的,比如:

customData.Add("_GooglePassword", "blabla"); // this is a String
customData.Add("_ServerPort", 8093); // this is an Int32
// etc...

在数据库中保存为 JSV,如下所示:

{_GooglePassword:blabla,_ServerPort:8093}

当我反序列化这个时,问题就出现了,回到 C# 中的字典,然后它把所有东西都作为字符串放回去,正如 VS 中的这个异常所示:

因此,我没有将它返回到类中定义的 Int32,而是得到了字符串,这会带来问题。我很确定使用普通 JSON 和 DataContract-approach 不会有这个问题,因为我在其他部分使用 JSON。

我错过了什么吗?

谢谢 =)

【问题讨论】:

  • 当您反序列化为Dictionary&lt;string,object&gt; 时,您的所有值都将是字符串。这也是 JSON 序列化程序中的默认行为。为什么不为数据创建一个类型?
  • 我有一个表应该包含一个设置超类的所有孩子。 Settings 超类包含一些基础数据,然后每个子类包含一些特定数据。但我不想为每个设置子类创建一个表。相反,我想将子类中的属性放入“CustomData”字段中,然后我将其解释为如上所示。
  • 如何为所有设置创建一个类并为特定部分使用接口?如果这不可能,您应该使用 int.TryParse 方法而不是直接强制转换。
  • 我现在正在使用 int.tryparse。它可以工作,但没有我想的那么干净……而且我看不出接口有什么帮助。我想我只需要坚持尝试解析

标签: c# servicestack ormlite-servicestack


【解决方案1】:

关于为什么在 DTO 中继承是一个坏主意的一些有趣观点 from ss authorhere

如果您的设置可以拆分为配置文件,我建议您将每个属性集群拆分为接口/类,并将它们存储在单独的强类型属性中。

根据您的上下文,如果您只是存储信息而不处理或将业务规则应用于这些设置,您可能会在属性中收到动态 json 并将其存储为字符串。这样您就不会为了存储目的而创建 Settings 类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2014-05-19
    相关资源
    最近更新 更多