# VisaState komprimering med hjälp av BZip2... senaste prototypen...

<datetime class="hidden">2004-02-29T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported, ASP.NET, Performance -->
Bara ett första hugg på detta, använder några klasser som jag använde i ett annat projekt (Jag kommer att tillskriva kompressionskoden senare ... Jag tror att jag fick det från [Sharpziplib Ordförande](http://www.icsharpcode.net/OpenSource/SharpZipLib/) saker - med vissa ändringar - Jag kommer att stoppa kommentarshuvuden tillbaka i för att följa licensierings grejer senare - just nu anser det bara som ett exempel) den faktiska koden för att komprimera visningsstaten är MYCKET enkel:

```
using System;
using System.Web.UI;
using System.IO;
namespace ViewStateCompression
{
    /// 
    /// Summary description for CompressedVSBasePage.
    /// 
    public class CompressedVSBasePage :System.Web.UI.Page
    {
        private LosFormatter  _formatter = new LosFormatter();
        protected override void SavePageStateToPersistenceMedium(object viewState)
        {
            StringWriter sw = new StringWriter();
            _formatter.Serialize(sw, viewState);
            ComDePress cmp = new ComDePress();
            string outStr = cmp.Compress(sw.ToString());
            Page.RegisterHiddenField("__COMPRESSEDVIEWSTATE",outStr);
        }
        protected override object LoadPageStateFromPersistenceMedium()
        {
            string vsString = Request.Form["__COMPRESSEDVIEWSTATE"];
            string outStr = new ComDePress().DeCompress(vsString);
            return _formatter.Deserialize(outStr);
        }
    }
}
```

För att använda den, bara ärva från denna sida i stället för den normala System.Web.UI.Page. Uppenbarligen förlorar du några av de normala Viewstate-funktioner som kryptering - men dessa bör vara lätt att slot tillbaka i...Jag ser för närvarande ganska stora besparingar i ViewState storlek från att använda detta - med BZip2 komprimering - eftersom det är en kod som jag hade ljuga om..., prova det. Alla kommentarer / förslag är, som alltid, uppskattat.

Jag har gjort en [testprojekt för att spela med detta](/uploads/ViewStateCompression.zip) , Det är VS.NET 2003, det har allt som krävs (inklusive komprimering grejer).

UPPDATERING: Bara gjort några tester med detta ... som ett exempel, med hjälp av en DataSet befolkad från "Select \* Från order" av Northwind DB bunden till en standard DataGrid (Jag valde detta för att vara den fläskigaste möjliga ...), Jag går från 659984 byte i min synhåll ner till 52080 bytes ... en besparing på cirka 92% - vilket jag tycker är ganska imponerande! Jag är säker på att det finns vissa nackdelar med detta (förutom de få extra cykler som krävs för komprimering) - men finns det någon verklig anledning varför MS inte ger en komprimering alternativ för ViewState ut-of-the-box - någon??

UPPDATERING: OK, för dem som har kritiserat koden ... detta är en PROTOTYPE - bara för att testa idén, Jag planerar att spela runt med detta lite mer vid något tillfälle och kommer att titta på inklusive några funky funktioner som [Denis Bauers visningStatstittare](http://www.denisbauer.com/ASPNETControls.aspx) inbyggda, olika komprimeringssystem, olika kryptering - inklusive otroligt effektiva [Två fiskar](http://www.codeproject.com/csharp/twofish_csharp.asp)- kort sagt kommer det att vara en leksak för mig att titta på och förlänga det nuvarande genomförandet av ViewState.