2010-02-28 2 views
5

IronPython에서 생성 된 일부 클래스를 유지하기 위해 개체 데이터베이스를 사용하고 싶습니다. 데이터베이스는 db4o for .NET 2.0 (오늘 다운로드)입니다. 코드는 다음과 같습니다 : 클래스 Person 표준 .NET 클래스가 아니기 때문에IronPython에서 생성 된 개체를 개체 데이터베이스에 저장하는 방법

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의 그 형 시스템임을 의심에서 예외를 얻을. 나는 System.IO.FileInfo을 지속하려고 노력했으며 잘 작동했습니다. IronPython에서 클래스의 인스턴스 인 객체를 어떻게 저장합니까?

수입의 cPickle db.Store (cPickle.dumps (P1)) 다음

및 cPickle.loads을 사용하여 (...) 가져 오는 객체 : 당신은 인스턴스를 지속 피클을 사용할 수

+0

철 python을 사용하여이 문제를 복제 할 수 있습니까? –

+0

.NET 어셈블리를 파이썬으로 가져 오는 방법을 모르겠습니다. (불가능하다고 생각했습니다). 그래서, 나는 현재의 지식으로 그것을 복제 할 수 없다. – stej

+0

아마 듣고 싶은 것은 아니지만 C#으로 모델을 정의하고 IronPython 환경으로 가져올 수 있습니다. 나는 너를 어떻게 끝내는 지 알고 싶어 할 것이다. – tarn

답변

2

Db4o는 CLR 반영 메커니즘을 사용하여 개체의 메타 정보를 저장하고 저장합니다. 이것은 C#, VB.NET 등에서 잘 작동합니다. IronPython 및 IronRuby와 같은 언어는 모든 훌륭한 동적 기능을 허용하기 위해 CLR 위에 추가 레이어를 사용했습니다.

이제 db4o에서 CLR- 반사가 사용되면 동적 기능을 구현하는 데 사용되는 추가 항목이 추가됩니다. 이 정보를 저장하려는 시도는 실패합니다. 현재 사용할 수있는 단순하고 우아한 솔루션이 없습니다 = (

  1. 주석에 이미 언급 한 것처럼 C# 또는 VB.NET에서 데이터 개체를 정의하면 평범한 CLR 개체를 사용할 수 있습니다. 가장 빠른 솔루션입니다 및 작동해야합니다.
  2. 당신은 reflector을 소유 작성하여 파이썬의 객체 모델에 대한 db4o는을 '가르 칠'수있다. 그러나 그것은 확실히 쉬운 일이 아니다.
  3. db4o는이 환경을 위해 만들어진 것입니다 'SelfReflector'을 가지고 기본적으로 각 개체에 필요한 메타 정보를 수동으로 추가하지만 이에 대한 문서는 찾을 수 없습니다.

또 다른 가능성은 db4o 대신 ZODB과 같이 Python 용으로 특별히 생성 된 ODBMS를 사용하는 것입니다. 그러나 ZOBR이 IronPython에서 실행되는지 확실하지 않습니다.

+0

답변 해 주셔서 감사합니다. 부정적 일 때도 대단히 도움이됩니다. # 2와 # 3을 재미있게 볼 것입니다. (정말로 필요하다면 # 1처럼 할 것입니다.) – stej

-1

뒤로.

+0

그건 좋은 생각이 아니야. 쿼리, 업데이트 등 db4o가 제공하는 거의 모든 기능이 느슨해 졌기 때문에 직렬화 된 객체를 db4o에 저장하는 것은 거의 쓸모가 없습니다. – Gamlor

+0

동의합니다. 객체 데이터베이스의 기능을 사용하고 싶습니다. 가능하지 않습니다. – stej