كيفية تخزين الكائنات التي تم إنشاؤها في IronPython إلى قواعد بيانات الكائنات

StackOverflow https://stackoverflow.com/questions/2352718

سؤال

أرغب في استخدام قاعدة بيانات الكائن لاستمرار بعض الفئات التي تم إنشاؤها في IronPython. قاعدة البيانات هي DB4O لـ .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-Replection لاسترداد المعلومات الوصفية للكائنات ، من أجل تخزينها. يعمل هذا بشكل جيد بالنسبة لـ C#و VB.net وما إلى ذلك. تستخدم لغات Ironpython و IronRuby طبقة إضافية في الأعلى CLR للسماح لجميع ميزات الديناميات الرائعة.

الآن عندما يستخدم DB4O ، فإن الانعكاس CLR هو إضافة الأشياء الإضافية المستخدمة لتنفيذ الميزات الديناميكية. في محاولة تخزين هذه المعلومات يفشل. لا يوجد حل أنيق متوفر اليوم = (

  1. كما ذكرنا بالفعل في التعليقات ، يمكنك تحديد كائن البيانات في C# أو VB.NET ، بحيث يكون لديك كائنات CLR قديمة. أعتقد أن هذا هو الحل الأسرع ويجب أن يعمل.
  2. يمكنك "تعليم" DB4O حول نموذج كائن بيثون من خلال كتابتك الخاصة العاكس. لكن هذا بالتأكيد ليس بالأمر السهل.
  3. يحتوي DB4O على "عكس SelfRefer" وهو مخصص للبيئات دون انعكاس. هناك بشكل أساسي إضافة يدويًا الوصفية المطلوبة لكل كائن. ومع ذلك لا يمكنني العثور على أي وثائق حول هذا.

هناك احتمال آخر هو استخدام ODBMS الذي يتم إنشاؤه خصيصًا لبيثون ، مثل Zodb بدلا من DB4O. لكنني لست متأكدًا مما إذا كان Zobr يعمل على IronPython.

نصائح أخرى

يمكنك استخدام المخلل لاستمرار الحالات:

استيراد cpickle db.store (cpickle.dumps (p1))

ثم استخدم cpickle.loads (...) لإعادة الكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top