using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
namespace Validate
{
    public class BasePage : System.Web.UI.Page//继承Page类
    {
        //重写保存状态方法,重载与重写,overload,重载即方法名相同参数不同.
        //重写,即改变父类的某个方法,方法改变后,父类的方法不用了.使用新方法.
        protected override void SavePageStateToPersistenceMedium(object state)//保存页的所有视图状态信息和控件状态信息。
        {
            //这一套方法,会用即可.
            //序列化 Web 窗体页的视图状态。
            LosFormatter formatter = new LosFormatter();
            //实现一个用于将信息写入字符串的 TextWriter。该信息存储在基础 StringBuilder 中
            StringWriter writer = new StringWriter();
            //将有限对象序列化 (LOS) 格式的对象转换为视图状态值并将结果放置在 TextWriter 对象中。
            formatter.Serialize(writer, state);
            string viewState = writer.ToString();
            //将 Unicode 字符数组的子集（它将二进制数据编码为 base 64 数字）转换成等效的 8 位无符号整数数组。
            //参数指定输入数组的子集以及要转换的元素数。
            //from,to对应方法.
            byte[] data = Convert.FromBase64String(viewState);
            //数据压缩
            byte[] compressedData = ViewStateHelper.Compress(data);
            //将 8 位无符号整数数组的值转换为它的等效 String 表示形式（使用 base 64 数字编码）。 
            string str = Convert.ToBase64String(compressedData);
            //获取用于管理脚本、注册脚本和向页添加脚本的 ClientScriptManager 对象。
            ClientScript.RegisterHiddenField("__MYVIEWSTATE", str);
        }

        protected override object LoadPageStateFromPersistenceMedium()
        {
            string viewstate = Request.Form["__MYVIEWSTATE"];
            //转化,然后解压.
            byte[] data = Convert.FromBase64String(viewstate);
            byte[] uncompressedData = ViewStateHelper.Decompress(data);
            string str = Convert.ToBase64String(uncompressedData);
            LosFormatter formatter = new LosFormatter();
            //将指定的视图状态值转换为有限对象序列化 (LOS) 格式的对象。
            return formatter.Deserialize(str);
        } 
    }
}
