如何将在IronPython中创建的对象存储到对象数据库

时间:2010-02-28 21:19:51

标签: .net ironpython db4o object-oriented-database

我想使用对象数据库来保存在IronPython中创建的一些类。该数据库是db4o for .NET 2.0(今天下载)。代码如下所示:

import clr
clr.AddReferenceToFileAndPath(r"C:\dev\Db4objects\db4o-7.12-net20\bin\net-2.0\Db4objects.Db4o.dll")
from Db4objects.Db4o import *
db = Db4oFactory.OpenFile(r'G:\IronPython\test\db4o\database.db')

class Person(object):  
  def __init__(self, name, age):
    self.Name = name
    self.Age = age

  def __str__(self):
    return 'Person: ' + self.Name + ' ' + str(self.Age)

p1 = Person('testp', 34)
db.Store(p1)

我在db.Store(p1)

得到例外
Unexpected char '$'
ThrowUncheckedException at offset 4 in file:line:column <filename unknown>:0:0
FatalShutdown at offset 136 in file:line:column <filename unknown>:0:0
AsTopLevelCall at offset 112 in file:line:column <filename unknown>:0:0
AsTopLevelStore at offset 34 in file:line:column <filename unknown>:0:0
StoreInternal at offset 69 in file:line:column <filename unknown>:0:0
Store at offset 66 in file:line:column <filename unknown>:0:0
Store at offset 12 in file:line:column <filename unknown>:0:0
Store at offset 15 in file:line:column <filename unknown>:0:0
   v Microsoft.Scripting.Actions.Calls.MethodCandidate.Caller.CallWithInstance(Object[] args, Boolean& shouldOptimize)
   v IronPython.Runtime.Types.BuiltinFunction.BuiltinMethodCaller`2.Call1(CallSite site, CodeContext context, TFuncType
func, T0 arg0)
   v System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
   v Microsoft.Scripting.Interpreter.DynamicInstruction`4.Run(InterpretedFrame frame)
   v Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   v Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 arg1)
   v IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
   v IronPython.Compiler.PythonScriptCode.Run(Scope scope)
   v IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction>b__0()
Exception: Unexpected char '$'
CLR Exception:
    Exception
:
Unexpected char '$'

我怀疑问题出在IronPython及其类型系统上,因为类Person不是标准的.NET类。我试图坚持System.IO.FileInfo并且效果很好。如何在IronPython中存储作为类实例的对象?

2 个答案:

答案 0 :(得分:2)

Db4o使用CLR反射机制来检索对象的元信息,以便存储它。这适用于C#,VB.NET等.TordPython和IronRuby等语言在CLR顶部使用了一个额外的层,以允许所有精彩的动态特性。

现在当db4o使用CLR-reflection时,会看到添加用于实现动态功能的其他内容。在尝试存储此信息失败。今天没有一个简单优雅的解决方案=(

  1. 正如评论中已经说明的那样,您可以在C#或VB.NET中定义数据对象,以便拥有普通的旧CLR对象。我认为这是最快的解决方案,应该可行。
  2. 你可以通过编写自己的reflector来'教'db4o关于python的对象模型。但这当然不容易。
  3. Db4o有一个'SelfReflector',适用于没有反射的环境。基本上手动添加每个对象所需的元信息。但是我找不到任何关于此的文件。
  4. 另一种可能性是使用专门为Python创建的ODBMS,例如ZODB而不是db4o。但我不确定ZOBR是否在IronPython上运行。

答案 1 :(得分:-1)

您可以使用pickle来保存实例:

导入cPickle db.Store(cPickle.dumps(P1))

然后使用cPickle.loads(...)将对象带回来。