将对象放入Session和其他序列化类型之间的序列化差异

时间:2015-10-09 10:43:42

标签: c# asp.net session session-state

背景

我们有很多用户保存的报告。这些报告所处的状态将保存到会话中(HttpSessionState)。

显然这是不好的做法,需要删除。真的不确定为什么它首先就是这样写的。

问题

代码中有一个处理保存这些报告的管理器,基本上是以下代码:

    public T GetObject<T>(string reportGuid)
    {
        try
        {
            return (T)context.Session[reportGuid];
        }
        catch
        {
            return default(T);
        }
    }

    public void SetObject(string reportGuid, dynamic value)
    {
        this.context.Session.Add(reportGuid, value);
    }

足够简单。总的来说,这会让会话变得非常庞大(我们已经看到它们超过1MB)。我们的会话以SQLServer模式存储,因此在某些时候(我假设)会话被序列化并存储在ASPStateTempSessions表中。

我们尝试用各种序列化程序替换它,例如Microsoft自己的XML Serialiser,JSON.Net的JsonSerialiser和二进制格式化程序。所有这些都写入文件然后检索。

然而,由于某种原因,由于某种原因通常填充了一个字符串的特定字段现在已经丢失了。

奇怪的是我不知道这个字段何时被设置。

public string XsltString
{
    get { return this.xsltString; }
    set { this.xsltString = value; }
}

这是有问题的字段。我在集合上放了一个断点,它永远不会被原始代码调用。

在旧方法中,会发生这种情况:

  1. 报告管理员将SetObject方法调用ID和报告(value)。此时XsltString未设置且为空。
  2. 在报告上完成了一些工作,然后在再次设置之前调用GetObject以使用新信息填充它。调用GetObject并从会话中检索对象时,XsltString现在具有值集。使用写入磁盘的方法时,未设置
  3. 所以我想我有两个问题。

    1. Session如何实际序列化/反序列化对象?我认为它是二进制的,但是我写入磁盘的结果与写入Session的结果不同。
    2. XsltString如何设定?永远不会调用set方法,当对象进入会话时,它不会被填充。我已经为Get和Set设置了断点,没有任何东西。我还检查了代码,除了通过这个类,其他任何地方都没有访问它。

0 个答案:

没有答案