gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:21:07 25 4
gpt4 key购买 nike

我想使用对象数据库来保留一些在 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 中存储作为类实例的对象?

最佳答案

Db4o 使用 CLR 反射机制来检索对象的元信息,以便存储它。这适用于 C#、VB.NET 等。诸如 IronPython 和 IronRuby 之类的语言在 CLR 之上使用了一个附加层,以允许所有出色的动态特性。

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

  • 正如评论中所述,您可以在 C# 或 VB.NET 中定义数据对象,以便您拥有普通的旧 CLR 对象。我认为这是最快的解决方案,应该可行。
  • 您可以通过编写自己的 reflector 来“教”db4o 关于 Python 的对象模型。 .但这当然并不容易。
  • Db4o 有一个“SelfReflector”,用于没有反射的环境。基本上手动添加每个对象所需的元信息。但是,我找不到任何关于此的文档。

  • 另一种可能性是使用专为 Python 创建的 ODBMS,例如 ZODB而不是 db4o。但我不确定 ZOBR 是否在 IronPython 上运行。

    关于.net - 如何将 IronPython 中创建的对象存储到对象数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2352718/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com