c# - ServiceStack 使用对象序列化和反序列化字典

标签 c# servicestack servicestack-text

我在这里遇到一个与 ServiceStack.Text 的序列化程序有关的非常奇怪的问题。

假设我有两个类,一个名为 Person,另一个名为 Address

人:

public class Person
{
    public string Name { get; set; }
    public Dictionary<string,object> ExtraParams { get; set; }
}

地址:

public class Address
{
    public string StreetName { get; set; }
}

在我执行此操作的方法之一

var john = new Person 
         {
           Name: "John",
           ExtraParameters: new Dictionary<string, object>
            {
                { "AddressList", new List<Address>{
                     new Address{ StreetName : "Avenue 1" }
                  }
                }
            }
         };

我也在使用ServiceStack的ORMLite。现在,当我尝试从数据库检索数据并将其转换回字典时,问题就出现了:

//save to database
var id = db.Save(john)

//retrieve it back
var retrieved = db.SingleById<Person>(id);

//try to access the Address List
var name = retrieved.Name; //this gives "John" 
var address = retrieved.ExtraParameters["AddressList"] as List<Address>; //gives null always , due to typecasting failed.

当我尝试调试时,ExtraParameters一个字典,其中key名为“AddressList”,但value 实际上是一个字符串 - "[{StreetName:"Avenue 1"}]"

有什么想法我哪里做错了吗?我已经上下查找了有关对象和字典类型转换的信息,但似乎没有一个与我有相同的问题。

我设置了以下配置:

JsConfig.ExcludeTypeInfo = true;
JsConfig.ConvertObjectTypesIntoStringDictionary = true;

最佳答案

首先存储对象bad idea for serialization我强烈避免使用它。

接下来,当您设置时,您将破坏对象的序列化:

JsConfig.ExcludeTypeInfo = true;

ServiceStack 仅在需要时添加类型信息,并且此配置阻止它序列化 JSON 有效负载中的类型信息,这是唯一告诉 ServiceStack 将其反序列化回所需内容的内容,因为您正在使用后期绑定(bind) objects 类型,否则 ServiceStack 无法知道该类型是什么。

关于c# - ServiceStack 使用对象序列化和反序列化字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37809499/

相关文章:

authentication - ServiceStack - UserAuth "Id"是 INT,而 RavenDb 预计 "Id"是 STRING

c# - Servicestack.Text ConvertTo<> tomap 具有不同名称的属性或任何其他解决方案?

c# - 如果我内联 HashSet 集合初始化,编译器是否知道只执行一次?

c# - 绑定(bind)静态 ObservableCollection 的问题

servicestack - 服务栈的推荐错误传播策略

c# - 从客户端进行身份验证后,ServiceStack session 未保存

c# - 反序列化后 JSON 字段值变为 null

用于系统间缓存的 C#/EF

visual-studio - 无法加载文件或程序集 Visual Studio 2019(社区)

c# - ServiceStack.Text 和 DeserializeFromString 其中 Json 名称是非法的