【发布时间】:2016-04-07 17:41:11
【问题描述】:
我已经实现了一个基于 Json.net 的 Json 序列化器来接受任何对象类型并将其序列化(以便放置到我的缓存中)
缓存接口不允许我指定类型,所以当我从缓存中检索时,我需要根据元信息动态创建类型。
这适用于对象,我现在面临的问题是我不适用于值类型,我会得到一个例外,说类似cannot cast JValue to JObject。
我的问题是如何同时满足值类型和对象类型的需求?如果有一个用于 JObject 的 TryParse 那就太好了,我可以自己编写它,但感觉就像我要掉进兔子洞一样?
实现这一目标的最佳方法是什么?
我的代码如下,Json.net的设置:
_settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
NullValueHandling = NullValueHandling.Ignore,
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
TypeNameHandling = TypeNameHandling.All
};
_settings.Converters.Add(new StringEnumConverter());
设置函数(序列化):
public void Put(string cacheKey, object toBeCached, TimeSpan cacheDuration)
{
_cache.Set(cacheKey, JsonConvert.SerializeObject(toBeCached, _settings), cacheDuration);
}
还有get(反序列化):
public object Get(string cacheKey)
{
try
{
var value = _cache.Get(cacheKey);
if (!value.HasValue)
{
return null;
}
var jobject = JsonConvert.DeserializeObject<JObject>(value);
var typeName = jobject?["$type"].ToString();
if (typeName == null)
{
return null;
}
var type = Type.GetType(typeName);
return jobject.ToObject(type);
}
catch (Exception e)
{
// Todo
return null;
}
}
【问题讨论】:
标签: c# serialization json.net