我有以下课程:
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”类型
答案 0 :(得分:0)
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没有。
注意:由于这适用于我的具体问题,它只能部分回答我问的问题。这就是为什么如果有人可能有更通用的解决方案,我会保持开放。