Friday, November 19, 2010

Silverlight compressed binary serialization

So... I did my first Silverlight app - very good fun (although there was a fair amount of head scratching too!)

As part of this app I needed to send some fairly chunky bits of data to the client. To do this I used and

On the server (in an offline process) the code that generated my compressed files looked like:

            using (var f = File.Create(zipFileName))
                using (var zipOut = new ZipOutputStream(f))
                    ZipEntry entry = new ZipEntry("stuff");
                    var toStore = Serialization.SilverlightSerializer.Serialize(myClass);
                    entry.DateTime = DateTime.Now;
                    entry.Size = toStore.Length;
                    zipOut.Write(toStore, 0, toStore.Length);

And in the Silverlight client the code looked like:

        public void LoadFrom(Uri url)
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.BeginGetResponse(new AsyncCallback(ReadCallback), request);

        private void ReadCallback(IAsyncResult asynchronousResult)
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
            using (ZipInputStream zipIn = new ZipInputStream(response.GetResponseStream()))
                ZipEntry entry;
                if ((entry = zipIn.GetNextEntry()) != null)
                    var myClass = Serialization.SilverlightSerializer.Deserialize<TheClass>(zipIn);
                    if (myClass == null)
                        MessageBox.Show("Some error has occurred - unable to read data - sorry!");

                    Dispatcher.BeginInvoke(() =>
                           // do stuff with myClass here

It all worked surprisingly well :)

No comments:

Post a Comment