ViewState和序列化对象版本控制

时间:2012-12-21 15:04:17

标签: asp.net .net json deployment viewstate

我们使用ASP.NET viewstate来存储我们自己的对象(即,不仅仅是原始类型)。每次我们进行构建时,构建号都会增加。我们试图解决的问题是在服务器更新期间:

  1. 用户加载页面
  2. 我们部署了新的Web应用程序版本
  3. 用户在同一页面上进行回发,并抛出异常:

    • HttpException:此页面的状态信息无效,可能已损坏。
    • ViewStateException:viewstate无效。
    • ArgumentException:序列化数据无效。
    • FileLoadException:无法加载文件或程序集'[我们的程序集],Version = [我们的新版本],Culture = neutral,PublicKeyToken = ...'或其依赖项之一。定位的程序集的清单定义与程序集引用
    • 不匹配
  4. 我理解为什么会发生这种情况 - ViewState是使用该类的先前版本序列化的,然后尝试使用新版本进行反序列化,而.NET序列化不支持该版本。

    我们考虑过创建一个自定义的PageStatePersister并使用JSON(然后加密它)来序列化/反序列化,因为数据成员几乎总是在构建之间兼容。

    还有其他想法吗?

1 个答案:

答案 0 :(得分:1)

首先,在viewstate上序列化数据并不是一个好主意,其中一个原因是这种反序列化与您的表现不匹配,但另一个问题是数据正在传送到服务器并返回每个回发。

我会使用一种简单的存储库方法,例如将数据存储在缓存或会话中,这样您就可以询问存储库,无论它在何处以及如何持久存储,这都用于模拟内存存储库。所以你有类似“MyDataSotarage.GetMyCustomObject()”和“MyDataSotarage.SaveMyCustomObject(CustomObject obj)”之类的内容,因此在存储库中有你的逻辑将项添加到缓存(例如使用userid和objct名称作为键)或session如果你喜欢(不要害怕他们,有些人会这样做)。它更像是一种设计方法,而不是实现方法,但通过这种方式,您将完全分离数据的存储方式,避免序列化问题,并节省网络流量的KB等。