Frage

Ich möchte Objektdatenbank verwenden, um einige Klassen in Ironpython erstellt bestehen bleiben. Die Datenbank ist db4o for .NET 2.0 (heruntergeladen heute). Der Code sieht wie folgt aus:

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)

Ich erhalte Ausnahme bei 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 '$'

Ich vermute, dass das Problem mit Ironpython und seiner Art System ist, weil die Klasse Person nicht Standard .NET-Klasse ist. Ich versuchte System.IO.FileInfo bestehen bleiben und es hat gut funktioniert. Wie kann ich speichere ein Objekt, das Instanz einer Klasse in Ironpython ist?

War es hilfreich?

Lösung

Db4o verwendet die CLR-Reflexionsmechanismen Meta-Informationen der Objekte abzurufen, um sie zu speichern. Dies funktioniert gut für C #, VB.NET etc. Sprachen wie Ironpython und IronRuby verwendet, um eine zusätzliche Schicht auf die CLR alle die wunderbare Dynamik Funktionen zu ermöglichen.

Nun, wenn DB4O verwendet die CLR-Reflektion sieht die zusätzliche Sachen hinzufügen, die die dynamischen Eigenschaften zu implementieren verwendet wird. Bei dem Versuch, diese Informationen zu speichern ist ausfällt. Es ist keine einfache eine elegante Lösung verfügbar heute = (

  1. Wie bereits in den Kommentaren erwähnt, könnten Sie Ihnen Daten-Objekt in C # oder VB.NET definieren, so dass Sie nur alte CLR-Objekte haben. Ich denke, dies ist die schnellste Lösung ist und sollte funktionieren.
  2. Sie könnten 'Teach' db4o über das Objekt-Modell von Python durch Schreiben Sie besitzen Reflektor . Aber das ist sicherlich nicht einfach.
  3. Db4o hat einen ‚SelfReflector‘, die für Umgebungen ohne Reflexion bestimmt. Es fügt grundsätzlich manuell die erforderlichen Meta-Informationen für jedes Objekt. Allerdings kann ich noch keine Dokumentation zu diesem Thema finden.

Eine andere Möglichkeit wäre eine ODBMS zu verwenden, die für Python speziell erstellt wird, wie ZODB statt db4o . Aber ich bin nicht sicher, ob ZOBR auf Ironpython ausgeführt wird.

Andere Tipps

Sie Gurke verwenden könnten die Instanzen bestehen bleiben:

Import cPickle db.Store (cPickle.dumps (p1))

und dann cPickle.loads verwenden (...), um das Objekt zurück zu bringen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top