【问题标题】:Keeping type information when serializing / deserializing序列化/反序列化时保留类型信息
【发布时间】:2016-07-16 23:01:55
【问题描述】:

我有以下课程:

public class Stuff {
  public int Id {get;set;}
  public Dictionary<string,object> Values {get;set;}
}

public class ComplexType {
  public string Name {get;set;}
  public string Id {get;set;}
}

现在一个对象可以包含这样的东西:

var myStuff=new Stuff ();
myStuff.Id=1;
myStuff.Values=new Dictionary<string,object>();
myStuff.Values.Add("magic",new ComplexType { Id=3, Name="Gonzo" };

当我序列化该数据时,一切都很好:

string data=JsonConvert.SerializeObject(myStuff) 

然而,在反序列化之后,复杂类型中的类型会丢失:

Stuff ret=JsonConvert.DeserializeObject (data,typeof(Stuff));

复杂数据类型的值是 object {Newtonsoft.Json.Linq.JObject} 而不是 object {MyNamespace.ComplexType}

当我尝试将其作为 JsonResult 的一部分返回时:

return new JsonResult { Data = ret };

如果我从浏览器调用该方法,则该值不包含任何数据,而是一个空数组。

那么如何确保序列化/反序列化不会破坏类型信息?我不明白为什么会发生这种情况:包含序列化数据的字符串根本不包含任何类型信息,并且在反序列化方法时无法“猜测”这可能是什么类型。

有没有办法在不丢失类型信息的情况下对数据进行序列化/反序列化?首选格式是 Json,但如果我需要使用另一种序列化格式(保存该信息)也可以。

注意:字典可能包含不同类型的值,所以值必须是“对象”类型

【问题讨论】:

    标签: c# json asp.net-mvc serialization


    【解决方案1】:

    我并没有真正解决原来的问题,而是解决了症状。我能够从 MVC 中返回一个有效结果,其中包含不返回 JsonResult 而是返回 ActionResult 所需的数据:

    public class MyResult:ActionResult {
      private JObject _data;
      public MyResult(object data) {
        _data=JObject.FromObject(data);
      }
      public override ExecuteResult(ControllerContext context) {
        var response=context.HttpContext.Response;
        response.ContentType="application/json";
        response.Write(_data.ToString());
      }
    }
    

    然后返回这个:

    return new MyResult(ret);
    

    ActionResult 返回可由 Get-Request 使用的有效响应。 JsonResult 没有。

    注意:由于这适用于我的具体问题,因此它只能部分回答我提出的问题。这就是为什么如果有人可能有更通用的解决方案,我将保持开放状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-28
      • 2014-10-26
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多