2010-02-28 14 views
5

IronPython'da oluşturulan bazı sınıfları devam ettirmek için nesne veritabanını kullanmak istiyorum. Veritabanı, .NET 2.0 için db4o'dur (bugün indirilmiştir). Kod şöyle görünür: Sınıf Person standart .NET sınıf olmadığı içinIronPython'da oluşturulan nesneleri nesne nesnelerine nesne olarak depolamak için nasıl kullanılır

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) 

Ben 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 '$' 

Sorun IronPython ve tipi sistemiyle olduğundan şüpheleniyorsanız de istisna olsun. System.IO.FileInfo'u kullanmaya çalıştım ve iyi çalıştı. IronPython'da bir sınıfın örneği olan bir nesneyi nasıl saklayabilirim?

ithalat cPickle db.Store (cPickle.dumps (p1)) sonra

ve cPickle.loads kullanmak (...) getirmek için nesneyi: Sen örneklerini devam etmek turşu kullanabilirsiniz

+0

Bu sorunu yalnızca python, demir olmayan bir python kullanarak çoğaltabilir misiniz? –

+0

.NET meclislerini python'a nasıl alacağımı bilmiyorum (bunun mümkün olmadığını düşündüm). Yani, şu andaki bilgilerimle çoğalamıyorum. – stej

+0

Muhtemelen duymak istediğiniz şey değil, ancak C# modellerinizi tanımlayabilir ve bunları IronPython ortamınıza aktarabilirsiniz. Eğer bunu nasıl çözdüğünüzü bilmeye hevesli olacağım. – tarn

cevap

2

Db4o, nesneleri saklamak için nesnelerin meta bilgilerini almak için CLR yansıtma mekanizmalarını kullanır. Bu, C#, VB.NET vb. Için iyi çalışır. IronPython ve IronRuby gibi diller, tüm harika dinamik özelliklere izin vermek için CLR üzerine ek bir katman kullandı.

Artık db4o, CLR yansımasını kullandığında, dinamik özellikleri uygulamak için kullanılan ek öğeleri de görür. Bu bilgiyi saklama girişimi başarısız olur. Orada değil zarif bir çözüm mevcut basit bugün = (

  1. Daha önce, yorum belirtilen Eğer düz eski CLR nesneleri, böylece C# veya VB.NET size veri nesnesini tanımlayabiliriz. Bunu düşünmek hızlı çözüm ve çalışması gerekir.
  2. sen reflector sahibi yazarak pitonun nesne modeli hakkında db4o 'öğretmek' olabilir. Ama bu kesinlikle kolay değil.
  3. db4o ortamları için tasarlanmış bir 'SelfReflector' vardır Yansıma olmadan temel olarak her nesne için gerekli olan meta-bilgileri manuel olarak ekleyelim.Ama bununla ilgili herhangi bir belge bulamıyorum

Diğer bir olasılık, db4o yerine ZODB gibi Python için özel olarak oluşturulmuş bir ODBMS kullanmak olabilir. Ama ZOBR'nin IronPython'da çalışıp çalışmadığından emin değilim.

+0

Cevabınız için teşekkür ederim, olumsuz olduğunda bile bana çok yardımcı olur. Sadece eğlenmek için # 2 ve # 3'e bir göz atacağım (gerçekten ihtiyacım olursa # 1'de yapacağım). – stej

-1

geri.

+0

Bu iyi bir fikir değil. Db4o'da seri hale getirilmiş nesneleri depolamak neredeyse işe yaramaz, çünkü db4o'nun neredeyse tüm özellikleri, sorgular, güncellemeler vb. Gibi özellikleri kaybediyorsunuz. – Gamlor

+0

Katılıyorum. Nesne veri tabanlarının özelliklerini kullanmak istiyorum ki bu mümkün olmayacaktı. – stej

İlgili konular