我遇到了db4o的问题,我想知道它是功能还是错误。
让我们看一些代码
private interface IInterface {}
private class SimpleObject : IInterface
{}
[TestMethod, Ignore]
public void _()
{
var replicableServer = Db4oFactory.OpenServer(Path.GetFullPath(@"testdb"), 777);
try
{
replicableServer.GrantAccess("user", "user");
var client2 = Db4oFactory.OpenClient("127.0.0.1", 777, "user", "user");
var client1 = Db4oFactory.OpenClient("127.0.0.1", 777, "user", "user");
client1.Store(new SimpleObject());
client1.Commit();
var query = client2.Query();
query.Constrain(typeof(IInterface));
Assert.AreEqual(1, query.Execute().Count);
}
finally
{
replicableServer.Close();
}
}
这里我们失败断言。但是如果我们将约束中的类型更改为 SimpleObject ,那么一切都会正常工作。这很奇怪,我找不到理由。
答案 0 :(得分:1)
谢谢你们。但我们解决了这个谜题。问题是,db4o只在首次保存后才保存有关对象及其实现的接口的信息。
因此,在使用它之前,我们将所有空对象保存到base。
答案 1 :(得分:0)
我不确切知道db4o是如何工作的,但是编写了一个文档db,我可以说db4o不太可能存储整个类型层次结构。它只会跟踪用于存储数据的类型。这实际上只适用于我的序列化。
要制作类似这样的工作,您可能需要构建自己的索引。存储对象时,对于层次结构中的每个类型(我希望Object
和IDisposable
除外)更新new TypeIndex { IndexedType = typeof(IInterface), ActualKey = ... }
之类的记录。