C# 会话作为参考.net内核
我是.NETCore的新手。 我在.NETCore中使用session,但我发现当我使用复杂对象时,我必须序列化/反序列化对象,然后保存在session中 这意味着,当我从会话加载一个复杂对象时,每次在页面状态结束时,我都必须在会话中序列化并保存该对象 只有当对象被修改时,才有一个技巧来序列化/保存对象 (我的意思是,在asp.net中,会话保存/加载是自动的,在.net core中有类似的作业吗?)C# 会话作为参考.net内核,c#,session,.net-core,C#,Session,.net Core,我是.NETCore的新手。 我在.NETCore中使用session,但我发现当我使用复杂对象时,我必须序列化/反序列化对象,然后保存在session中 这意味着,当我从会话加载一个复杂对象时,每次在页面状态结束时,我都必须在会话中序列化并保存该对象 只有当对象被修改时,才有一个技巧来序列化/保存对象 (我的意思是,在asp.net中,会话保存/加载是自动的,在.net core中有类似的作业吗?) 谢谢大家。我不确定这种技巧,但您可以引入一些扩展方法来接受类型化参数以进行缓存值设置/检索 一
谢谢大家。我不确定这种技巧,但您可以引入一些扩展方法来接受类型化参数以进行缓存值设置/检索 一个可能的实现选项是将要缓存的对象序列化为JSON,然后缓存它的UTF8表示。使用可以序列化具有所有必需依赖项的整个对象层次结构,以便在反序列化时恢复整个层次结构
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;
}
}
}
公共静态类TypedSessionValuesException
{
公共静态无效集(此ISession会话,字符串键,T值)
{
var json=JsonConvert.SerializeObject(值,
新JsonSerializerSettings{
PreserveReferencesHandling=PreserveReferencesHandling.All
});
var bytes=Encoding.UTF8.GetBytes(json);
session.Set(键,字节);
}
公共静态bool TryGetValue(此ISession会话,字符串键,out T值)
{
字节[]字节;
if(!session.TryGetValue(键,输出字节))
{
值=默认值(T);
返回false;
}
尝试
{
var json=Encoding.UTF8.GetString(字节);
value=JsonConvert.DeserializeObject(json);
返回true;
}
抓住
{
值=默认值(T);
返回false;
}
}
}
请注意,在复杂层次结构和引用相同对象的不同缓存值的情况下,这种方法可能会增加不必要的开销和反序列化对象复制。在这种情况下,您可以使用更适合对象层次结构的序列化方法实现
Set()
和TryGetValue()
扩展。对不起,这并不意味着每次都必须在页面状态结束时保存所有对象?