↓【db4o】の公式ページ
http://www.db4o.com/japan/Default.aspx

オブジェクトデータベースということで、C#のオブジェクト(インスタンス)をそのまま、
データベースに保存・読み出しできます。

ためしにWebBrowserコンポーネントをデータベースに保存・読み出ししてみました。

が、WebBrowserコンポーネントは中身はCOMなので、保存時に例外が発生しました。

でも、WebBrowserコンポーネントには、DocumentStreamプロパティがありましたので、
これを利用するよう、まず、以下のdocクラスを作成しました。

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using mshtml;
using System.IO;


namespace cstest1
{
    public class doc 
    {
        private static int id = 0;
        private int id_ = 0;
        private StreamReader a_ = null;
        private MemoryStream ms_ = null;
        private string url_ = null;

        public doc( StreamReader s,MemoryStream ms, string url )
        {
            this.a_ = s;
            this.ms_ = ms;
            doc.id++;
            this.id_ = doc.id;
            this.url_ = url;
        }

        public int ID
        {
            get
            {
                return this.id_;
            }
        }

        public string URL
        {
            get
            {
                return this.url_;
            }
        }

        public MemoryStream getStream()
        {
            return this.ms_;
        }

    }
}

で、次に、docクラスをdb4oに保存するフォームを以下のように作成しました。
コメントアウトがありますが、試行錯誤のあとなので、無視してください)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Db4objects.Db4o;
using System.IO;

namespace cstest1
{
    public partial class Form1 : Form
    {
        //public Stream ddd = null;

        //private DataTable dt = new DataTable();
        private List docCollection = null;

        public Form1()
        {
            InitializeComponent();
            //this.dt.Columns.Add(new DataColumn("url", typeof(string)));
            //this.dt.Columns.Add(new DataColumn("id", typeof(int)));
        }

        private void button1_Click(object sender, EventArgs e)
        {
            web1.Navigate("http://www.yahoo.co.jp");

            //HtmlDocument doc = web1.Document;

        }

        private void button2_Click(object sender, EventArgs e)   //■docを保存■
        {
            //HtmlDocument d = web1.Document;

            IObjectContainer dba = Db4objects.Db4o.Db4oFactory.OpenFile("test.db");

            Stream documentStream = web1.DocumentStream;
            MemoryStream memoryStream = new MemoryStream();

            byte byteBuf = new byte[4096];
            int bytes = 0;

            while ((bytes = documentStream.Read(byteBuf, 0, 4096) )> 0)
            {
                memoryStream.Write(byteBuf, 0, bytes);
            }
            memoryStream.Position = 0;
            //this.ddd = memoryStream;

            StreamReader tmpStream = new StreamReader(memoryStream);
            tmpStream.ReadToEnd();

            memoryStream.Position = 0;

            doc tmpDoc = new doc(tmpStream,memoryStream,web1.Url.ToString());

            /*
            DataRow row = this.dt.NewRow();
            row["url"] =  web1.Url.ToString();
            row["id"] = tmpDoc.ID;
            this.dt.Rows.Add(row);
             */

            /*
            int i = 1;

            doc docobj = new doc();

            docobj.AA = d.IHTML;

            coc c = new coc(d.Cookie);
            */

            try
            {
                //dba.Set(tmpStream);
                dba.Set(tmpDoc);
                //dba.Set(memoryStream);
            }
            catch (Exception excp)
            {
                MessageBox.Show(excp.ToString());
            }
            finally
            {
                dba.Close();
            }


        }

        private void button3_Click(object sender, EventArgs e)   //■docを読み込み■
        {
            IObjectContainer dba = Db4objects.Db4o.Db4oFactory.OpenFile("test.db");

            doc tmpDoc = null;
            IList docs = null;

            try
            {
                docs = dba.Query(       //■db4oのマニュアル参照。Native Query。といっても単なる匿名メソッド(無名デリゲート)■
                    delegate(cstest1.doc oneDoc)   //■検索条件。ここでは、ID==1のdocの場合のみdelegateがtrueをreturnするので、ID==1のdocのみ抽出される。■
                    {
                        return oneDoc.ID == 1;  //■ここをカスタマイズする。たとえば、return true;にすると、全docオブジェクトが抽出される。■
                    });
                if (!(docs.Count == 0))
                {
                    this.docCollection = new List(docs);
                    tmpDoc = docs[0];
                }
            }
            catch (Exception excp)
            {
                MessageBox.Show(excp.ToString());
            }
            finally
            {
                dba.Close();
            }



            Stream memoryStream = web1.DocumentStream;
            //Stream ss = this.ddd;
            Stream stream = tmpDoc.getStream();

            //■ここは注意。Streamのデータポインタは保存時にデータの最後になっていてそのまま保存されてしまって■
            //■いるため、ここでデータポインタを0に初期化し、データの先頭を指すようにする■
            //■(ここで0にしないと、WebBrowserコンポーネントはなにも表示しない)■
            stream.Position = 0;  

            web1.DocumentStream = stream;    //■コレだけで、WebBrowserに元のWebページが再現■
            
            //web1.DocumentStream = this.ddd;

            /*
            ss.Position = 0;

            byte buf = new byte[4096];
            int bytes = 0;

            while *1 > 0)
            {
                ms.Read(buf, 0, bytes);
            }
             */
            
        }

        private void button4_Click(object sender, EventArgs e)
        {
            web1.Navigate("file:///c:/aaa.txt");
        }

        private void button5_Click(object sender, EventArgs e)   //■ついでに、DataGridViewに表示■
        {
            this.dataGridView1.AutoGenerateColumns = true;
            //this.dataSet1.Tables.Add(this.dt);
            this.bindingSource1.DataSource = this.docCollection;   //■ListをbindingDatasourceに与えると、データソースになる■
            //this.dataGridView1.DataSource = this.dataSet1;
            this.dataGridView1.DataSource = this.bindingSource1;   //■ややこしいけど、DataGridViewのデータソースはbindingDatasourceにする■
            this.dataGridView1.AutoResizeColumns( DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);



        }
    }
}


サンプルは以下のようになりました。

*1:bytes = ss.Read(buf, 0, 4096