会话作为参考 .NET 核心



我是.net核心的新手。 我在 .net 核心中使用会话,但我看到当我使用复杂对象时,我必须序列化/反序列化对象,然后保存在会话中。

这意味着当我从会话加载复杂对象时,每次在页面状态结束时都必须将该对象序列化并保存在会话中。

有一个技巧可以在修改对象时才序列化/保存对象?

(我的意思是,在 asp.net 中,会话保存/加载是自动化的,.net core 中有类似的工作?

谢谢大家。

我不确定这样的技巧,但您可以引入一些扩展方法来接受缓存值设置/检索的类型化参数。

可能的实现选项之一是将要缓存的对象序列化为 JSON,然后缓存它的 UTF8 表示形式。使用 Json.NET 的PreserveReferencesHandling.All可以使用所有必需的依赖项序列化整个对象层次结构,以便在反序列化时还原整个层次结构。

public static class TypedSessionValuesExtensions
{
public static void Set<T>(this ISession session, string key, T value)
{
var json = JsonConvert.SerializeObject(value,
new JsonSerializerSettings {
PreserveReferencesHandling = PreserveReferencesHandling.All
});
var bytes = Encoding.UTF8.GetBytes(json);
session.Set(key, bytes);
}
public static bool TryGetValue<T>(this ISession session, string key, out T value)
{
byte[] bytes;
if (!session.TryGetValue(key, out bytes))
{
value = default(T);
return false;
}
try
{
var json = Encoding.UTF8.GetString(bytes);
value = JsonConvert.DeserializeObject<T>(json);
return true;
}
catch
{
value = default(T);
return false;
}
}
}

请注意,在复杂的层次结构和引用相同对象的不同缓存值的情况下,此方法可能会增加不必要的开销和反序列化对象重复。在这种情况下,您可以使用更适合对象层次结构的序列化方法实现Set<T>()TryGetValue<T>()扩展。

最新更新