CompressPageStatePersister

public class CompressPageStatePersister:PageStatePersister
    {
        
private string pagestateKey = "__VIEWSATE";

        
public CompressPageStatePersister(Page p):base(p)
        {

        }

        
public override void Save()
        {
            
if (!Page.EnableViewState)
            {
                
this.ViewState = null;
            }
            
if (this.ViewState !=null || this.ControlState != null)
            {
                Pair state 
= new Pair(ViewState, ControlState);
                var str 
= CompressHelp.Compress(state);
                Page.ClientScript.RegisterHiddenField(
this.pagestateKey, str);
            }
        }
        
public override void Load()
        {
            
string postbackState = Page.Request.Form[pagestateKey];
            
if (!string.IsNullOrEmpty(postbackState))
            {
                Pair statePair 
=(Pair) CompressHelp.Decompress(postbackState);
                
if (!Page.EnableViewState)
                {
                    
this.ViewState = null;
                }
                
else
                {
                    
this.ViewState = statePair.First;
                }
                
this.ControlState = statePair.Second;
            }
        }

        
    }

    
public class CompressHelp 
    {
        
private static LosFormatter formatter = new LosFormatter();
        
public static string Compress(object state)
        {
            StringWriter writer 
= new StringWriter();
            formatter.Serialize(writer, state);
            
string stateString = writer.ToString();
            writer.Close();
            
byte[] buffer = Convert.FromBase64String(stateString);
            MemoryStream ms 
= new MemoryStream();
            GZipStream zipStream 
= new GZipStream(ms, CompressionMode.Compress, true);
            zipStream.Write(buffer, 
0, buffer.Length);
            zipStream.Close();
            buffer 
= new byte[ms.Length];
            ms.Position 
= 0;
            ms.Read(buffer, 
0, buffer.Length);
            ms.Close();
            stateString 
= Convert.ToBase64String(buffer);
            
return stateString; 
        }

        
public static object Decompress(string stateString)
        {
            
byte[] buffer = Convert.FromBase64String(stateString);
            MemoryStream ms 
= new MemoryStream();
            GZipStream zipStream 
= new GZipStream(ms, CompressionMode.Decompress);
            MemoryStream msReader 
= new MemoryStream();
            buffer 
= new byte[0x1000];
            
while (true)
            {
                
int read = zipStream.Read(buffer, 0, buffer.Length);
                
if (read<0)
                {
                    
break;
                }
                msReader.Write(buffer, 
0, read);
            }
            zipStream.Close();
            ms.Close();
            msReader.Position 
= 0;
            buffer 
= msReader.ToArray();
            stateString 
= Convert.ToBase64String(buffer);
            
return formatter.Deserialize(stateString);
        }
    }
原文地址:https://www.cnblogs.com/cnbwang/p/2034887.html