[python] XML-RPC
Radek Kanovsky
rk na dat.cz
Pátek Červenec 18 17:46:36 CEST 2008
On Thu, Jul 17, 2008 at 11:20:07AM +0200, Petr Dlabal wrote:
> Moje zkusenosti jsou jen o malo vetsi nez nula, ale podle me xmlrpclib
> neumi serializovat new-style class, tzn. class Foo(object):pass nelze.
On sice umi serializovat old-style tridu, ale na druhe strane z toho
uz nevyleze instance puvodni tridy, ale obycejny dict.
>>> import xmlrpclib
>>> class X: pass
...
>>> x = X()
>>> x.a = 42
>>> xmlrpclib.loads(xmlrpclib.dumps((x,)))
(({'a': 42},), None)
Protoze XMLRPC by melo fungovat mezi implementacemi v ruznych jazycich,
je mnozina podporovanych datovych typu a kontejneru hodne omezena.
> Pokusne jsem to resil (a snad by to melo jit) ze jsem tu slozitou
> classu pred vyslanim xml-rpc serverem (tzn. pred serializaci)
> zapikloval a pak zas v klientovi rozpikloval...
> stara class Foo:pass by mela jit serializovat snad i celkem slozita
To by mohlo fungovat, pokud vam do toho nepoleze nikdo cizi. Prijmat
zapiklena data od neduveryhodneho zdroje se z bezpecnostnich duvodu
nedoporucuje. A moc pekne ta dvojnasobna serializace take nevypada :-)
Pokud ten objekt neni moc slozity, stacilo by mozna jednoduse poslat
pres RPC jeho __dict__ a na druhe strane instanci zrekonstruovat.
# server
>>> rpcdata = xmlrpclib.dumps((x.__dict__,)))
# klient
>>> ((state,),_) = xmlrpclib.loads(rpcdata)
>>> state
{'a': 42}
>>> y = X()
>>> y.__dict__.update(state)
Radek Kaňovský, Dat, s.r.o.
Další informace o konferenci Python