在序列化/反序列化时保留类型信息

时间:2016-03-29 11:51:19

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

我有以下课程:

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,但是如果我需要使用另一种序列化格式(保存那些信息)也可以。

注意:字典可能包含不同类型的值,因此值必须为“object”类型

1 个答案:

答案 0 :(得分:0)

我并没有真正解决原来的问题,而是症状。我能够从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没有。

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