DB4O有.NET、MONO和Jave版本,全部用托管代码写成并且开放源代码。如果关注Mono的
朋友应该注意到Mono中已经有个可选安装组件DB4O。可以从他们的网站http://www.db4o.com/下载源代码。
对于这个对象数据库我只做了初步的研究。感觉操作很像我们怀念的ObjectSet。我个人凭感觉主观认为这个的性能肯定比不上XPO或者Hibernate,毕竟只是一个一个编译出来300多k的DLL。估计应用价值就是在C/S程序的客户端缓存,操作确实方便。
下面我简单来说一下DB4O的使用方法:
1. 定义对象
我们定义三个类,为的是测试DB4O处理对象间的关系。
People
Car
CarCollection
2. 保存对象
private void WriteDate()

{
//初始化对象数据
People format=new People("format",true,DateTime.Now);
format.Cars.AddCar(new Car("format's Car",CarColor.Blue));
format.Cars.AddCar(new Car("format's Car 2",CarColor.Red));
People bill=new People("Bill",true,DateTime.Now);
bill.Cars.AddCar(new Car("bill's Car",CarColor.Black));
bill.Cars.AddCar(new Car("bill's Car",CarColor.Red));
ObjectContainer db=Db4o.openFile("formatData.yap");
try

{
// do something with db4o
//保存format和bill
db.set(format);
db.set(bill);
}
finally

{
db.close();
}
}
3. 对象的简单查询
4. 对象的高级查询

/**//// <summary>
/// 高级查询获得数据
/// </summary>
private void SearchDate()

{
ArrayList data=new ArrayList();
ObjectContainer db=Db4o.openFile("formatData.yap");
Query query = db.query();
query.constrain(typeof(People));
//注意这里的name是类中的字段,属性编译后实际上是两个方法
query.descend("name").constrain("format").equal();
ObjectSet result = query.execute();
int legth=result.size();
try

{
// do something with db4o
//这里不知道是否是个BUG,我照文档上的用while循环,就outofMemory
for(int i=0;i<legth;i++)

{
data.Add(result.next());//把查询出的对象添加到ArrayList
}
this.grdPeople.DataSource=data;
}
finally

{
db.close();
}
}
下载完整的代码
DB4O最大的优点在于我们保存的对象没有继承或实现接口,也就是象ObjectSpace那样对对象没有注入东西,而且还不用维护什么映射表,可以说是结合了ObjectSpace和XPO的优点。
我觉得DB4O的查询结果是通过一个接口来实现,我们还要把把对象放到集合中还需要自己处理,这样不象XPO那样很方便,另外真正的对象数据库查询应该不用我们控制查询的层次深度,这个有数据库在我们调用对象的时候自动完成,我们访问数据库就象访问内存集合,同时在大数据量的时候又能有好的表现。估计这一天不会太远了。
其他象对象的更新,删除这些比较简单的操作这里就不例举,请参看DB4O的文档。DB4O的高级查询中还有对象层次查询深度的控制,这里也没有例举。