So you have an ADO.NET application that saves its data locally. Maybe you're caching, maybe you never upload the data to a server and it's a client-side-only application. I fall into the latter category. How do you do it? Well, the easiest approach is to save the DataSet object to disk using its WriteXml method:

 ds.ReadXml(fileName); // do some stuff ds.WriteXml(fileName); 

That's just dandy except for the bloat you get with XML - what should be a fairly small file turns out to be pretty big once you add all those plain-text tags in there.

So my solution was to compress the XML before I saved it to disk. Check it out:

    public void ReadFile(string fileName)
    {
        using (FileStream fs = new FileStream(fileName, FileMode.Open))
        {
            Stream s;
            if (Path.GetExtension(fileName) == ".cmx")
            {
                s = new GZipStream(fs, CompressionMode.Decompress);
            }
            else if (Path.GetExtension(fileName) == ".cmz")
            {
                s = new DeflateStream(fs, CompressionMode.Decompress);
            }
            else
            {
                s = fs;
            }
            ReadXml(s); 
            s.Close();
         }
     }

     public void WriteFile(string fileName)
     {
         using (FileStream fs = new FileStream(fileName, FileMode.Create))
         {
             Stream s;
             if (Path.GetExtension(fileName) == ".cmx")
             {
                 s = new GZipStream(fs, CompressionMode.Compress);
             }
             else if (Path.GetExtension(fileName) == ".cmz")
             {
                 s = new DeflateStream(fs, CompressionMode.Compress);
             }
             else
             {
                 s = fs;
             }
             WriteXml(s);
             s.Close();
         }
    } 

So the code above compresses the file in two different ways, depending on the extension passed in the filename. It was a good way for me to test which worked better (GZip in my tests, by the way).

These methods are actually methods of my own strongly-typed DataSet, which is why I'm able to call ReadXml and WriteXml directly. There's no reason you can't adapt them so that they accept a DataSet as a parameter, though!

The new version of Microsoft Office uses a technique similar to this - it saves its files out as a folder structure containing XML files, then compresses them in ZIP format. That might work for you, too.