Pickle vs XML for file I/O

crystalattice crystalattice at yahoo.com
Mon Jul 31 23:51:40 EDT 2006


On Mon, 31 Jul 2006 14:35:39 -1000, Simon Forman <rogue_pedro at yahoo.com>  
wrote:

> crystalattice wrote:
>> I'm creating an RPG for experience and practice.  I've finished a
>> character creation module and I'm trying to figure out how to get the
>> file I/O to work.
>>
>> I've read through the python newsgroup and it appears that shelve
>> probably isn't the best option for various reasons.  This lead me to
>> try messing w/ pickle, but I can't figure out how to use it with
>> classes.  I've found many examples of using pickle w/ non-OOP code but
>> nothing that shows how to use it w/ classes, subclasses, etc.  I've
>> read the documentation but it doesn't explain it well enough for me.
>>
>> Then I started thinking perhaps I'm going about it wrong.  My current
>> thought is to save an instance of each character so all the info (name,
>> skills, hit points, etc.) is stored in one place.  But looking at
>> OpenRPG made me think that perhaps using XML to store the information
>> would be better.  Each character could have a separate XML file, though
>> I don't know how it would work if many NPC's are required.
>>
>> I guess my question is, what are the benifits of getting pickle to work
>> w/ my classes vs. converting all the character data into XML and just
>> writing that to a file?  Since most of the data would need to be
>> modified often, e.g. hit points, is one storage format better than the
>> other?  Can you even modify data if it's been pickled w/o having to
>> unpickle it, change the data, then repickle it?
>
> Um, there's nothing tricky to using pickle with classes:
>
> |>> import pickle
> |>> class foo: pass
> |>> f = foo()
> |>> pstr = pickle.dumps(f)
> |>> pstr
> '(i__main__\nfoo\np0\n(dp1\nb.'
> |>> newf = pickle.loads(pstr)
> |>> newf
> <__main__.foo instance at 0xb664690c>
>
> Pickle is simple and should work "out-of-the-box".  I wouldn't mess
> with XML until I was sure I needed it for something.
>
> What kind of trouble were you having with pickle?
>
> Peace,
> ~Simon
>
It's mostly a combination of things (I hope you can follow my logic).   
First, to use "good programming practice", I want to implement a  
try/except block for opening the pickle file.  But I can't figure out if  
this block should be included outside the classes, included in just the  
base class, or if the base and subclasses need it; I'm leaning to putting  
outside the classes as a global method.

When pickling a class instance, is the pickle statement placed within the  
class (say, at the end of the class) or is it where the instance is  
created, such as a test() method?

Do I even need to bother with having the try/except block and pickle  
statements in the character generation module or should I have a separate  
module that does the file I/O, such that it opens the new file, calls the  
character module and makes a new instance, then pickles it?

Plus, to modify data in a class, do I have to unpickle the whole thing  
first or is there a way to modify the data while it's pickled?  Actually,  
I think I can answer that last question:  a character instance, having  
been created, will stay resident in memory until the player quits,  
character dies, or otherwise is no longer needed.  At that point the  
character instance should be pickled (if necessary) to disk; pickle  
shouldn't be used while data modification is required and the class  
instance is "active", correct?

I also remember reading on a thread here that pickle sometimes has issues  
when used with classes, which makes me hesitant to pickle an entire class  
instance.  That's why I thought XML may be safer/better.


-- 
Python-based online RPG in development based on the Colonial Marines from  
"Aliens": http://cmrpg.sourceforge.net

Using Opera's revolutionary e-mail client: http://www.opera.com/mail/



More information about the Python-list mailing list