Patch #1070046: Marshal new-style objects like InstanceType

in xmlrpclib.
This commit is contained in:
Martin v. Löwis 2006-11-19 18:51:54 +00:00
parent 9eec51c04f
commit 07529354db
4 changed files with 33 additions and 4 deletions

View File

@ -68,7 +68,10 @@ Python type):
\lineii{arrays}{Any Python sequence type containing conformable \lineii{arrays}{Any Python sequence type containing conformable
elements. Arrays are returned as lists} elements. Arrays are returned as lists}
\lineii{structures}{A Python dictionary. Keys must be strings, \lineii{structures}{A Python dictionary. Keys must be strings,
values may be any conformable type.} values may be any conformable type. Objects
of user-defined classes can be passed in;
only their \var{__dict__} attribute is
transmitted.}
\lineii{dates}{in seconds since the epoch (pass in an instance of the \lineii{dates}{in seconds since the epoch (pass in an instance of the
\class{DateTime} class) or a \class{DateTime} class) or a
\class{\refmodule{datetime}.datetime}, \class{\refmodule{datetime}.datetime},
@ -100,6 +103,10 @@ described below.
compatibility. New code should use \class{ServerProxy}. compatibility. New code should use \class{ServerProxy}.
\versionchanged[The \var{use_datetime} flag was added]{2.5} \versionchanged[The \var{use_datetime} flag was added]{2.5}
\versionchanged[Instances of new-style classes can be passed in
if they have an \var{__dict__} attribute and don't have a base class
that is marshalled in a special way.}{2.6}
\end{classdesc} \end{classdesc}

View File

@ -86,6 +86,15 @@ class XMLRPCTestCase(unittest.TestCase):
s = xmlrpclib.dumps((new_d,), methodresponse=True) s = xmlrpclib.dumps((new_d,), methodresponse=True)
self.assert_(isinstance(s, str)) self.assert_(isinstance(s, str))
def test_newstyle_class(self):
class T(object):
pass
t = T()
t.x = 100
t.y = "Hello"
((t2,), dummy) = xmlrpclib.loads(xmlrpclib.dumps((t,)))
self.assertEquals(t2, t.__dict__)
def test_dump_big_long(self): def test_dump_big_long(self):
self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,)) self.assertRaises(OverflowError, xmlrpclib.dumps, (2L**99,))

View File

@ -630,9 +630,19 @@ class Marshaller:
try: try:
f = self.dispatch[type(value)] f = self.dispatch[type(value)]
except KeyError: except KeyError:
raise TypeError, "cannot marshal %s objects" % type(value) # check if this object can be marshalled as a structure
else: try:
f(self, value, write) value.__dict__
except:
raise TypeError, "cannot marshal %s objects" % type(value)
# check if this class is a sub-class of a basic type,
# because we don't know how to marshal these types
# (e.g. a string sub-class)
for type_ in type(value).__mro__:
if type_ in self.dispatch.keys():
raise TypeError, "cannot marshal %s objects" % type(value)
f = self.dispatch[InstanceType]
f(self, value, write)
def dump_nil (self, value, write): def dump_nil (self, value, write):
if not self.allow_none: if not self.allow_none:

View File

@ -101,6 +101,9 @@ Core and builtins
Library Library
------- -------
- Patch #1070046: Marshal new-style objects like InstanceType
in xmlrpclib.
- cStringIO.truncate(-1) now raises an IOError, like StringIO and - cStringIO.truncate(-1) now raises an IOError, like StringIO and
regular files. regular files.