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.