[Grok-dev] Pickling an object stored in the Zodb. How do I skip the __parent__ attribute?
Sebastian Ware
sebastian at urbantalk.se
Fri Aug 15 10:19:25 EDT 2008
I have succeeded in exporting a list of objects using an adapter to
override __getstate__ for the root object. I have no references bellow
the "root objects" (except __parent__ in each root object) so I don't
have to worry about checking if objects are "outside" the branch that
I am exporting. The code is basically the following:
class IExportableObject(Interface):
pass
class ExportableObject(grok.Adapter):
"""
This adapter is used for the root object that I want to export.
It
removes the __parent__ reference from the __getstate__ dictionary
thus stopping the the pickler from traversing bellow the root
object
in the object graph.
"""
grok.context(protonbase.ProtonObject)
grok.provides(IExportableObject)
def __getstate__(self):
state = self.context.__getstate__()
del state['__parent__']
return state
and it is called from an export view that looks like this:
class Export(grok.View):
grok.context(ProtonCMS)
def update(self):
import cPickle
tmp = []
for obj in self.context['default'].values():
xobj = interfaces.IExportableObject(obj)
tmp.append(xobj)
self.exportdata = cPickle.dumps(tmp)
return
def render(self):
from tempfile import TemporaryFile
exportfile = TemporaryFile('w')
exportfile.write(self.exportdata)
filename = self.context.__name__ + '.export'
response = self.request.response
response.setHeader('Content-Disposition',
'attachment; filename=%s' % filename)
response.setHeader('Content-Type', 'application/octet-stream')
return exportfile
This exports the data including annotations. Now I am going to start
working on the import :)
Mvh Sebastian
14 aug 2008 kl. 20.03 skrev Kevin Smith:
> Hi Sebastion,
>
> Please let me know if you make headway with this, I've tried a
> number of things to make this work, without success.
>
> Thanks,
>
> Kevin Smith
>
> Sebastian Ware wrote:
>>
>> Thanks for the pointer! I have read:
>>
>> http://www.python.org/dev/peps/pep-0307/
>>
>> And found that the pickling is done by calling the method you refered
>> to:
>>
>> __getstate__()
>>
>> and that it really does exist on the objects in the Zodb. I will
>> override the method by means of an adapter for the root object that I
>> am pickling and remove the attribute [__parent__]. Feels as though
>> this might actually work :)
>>
>> Mvh Sebastian
>>
>> 14 aug 2008 kl. 15.11 skrev Jegenye 2001 Bt (Miklós Prisznyák):
>>
>>
>>> 2008/8/14 Sebastian Ware <sebastian at urbantalk.se>
>>> I am trying to export and import objects from the Zodb using
>>> cPickle.dumps().
>>>
>>> My problem is that the pickler traverses the __parent__ attribute
>>> thus
>>> returning a much larger object graph than I wish to serialize.
>>>
>>> Do I have to subclass the pickler or is there som other smart way of
>>> making it skip the __parent__ attribute?
>>>
>>>
>>> You could write an adapter (or modify the class of the content
>>> objects itself) to use __setstate__ and __getstate__ , etc:
>>>
>>> http://www.python.org/doc/2.5/lib/node321.html
>>>
>>> --
>>> Best regards,
>>> Miklós
>>>
>>> _______________________________________________
>>> Grok-dev mailing list
>>> Grok-dev at zope.org
>>> http://mail.zope.org/mailman/listinfo/grok-dev
>>>
>> _______________________________________________
>> Grok-dev mailing list
>> Grok-dev at zope.org
>> http://mail.zope.org/mailman/listinfo/grok-dev
>>
>>
>>
> <kevin.vcf>
More information about the Grok-dev
mailing list