crack icon indicating copy to clipboard operation
crack copied to clipboard

parsing of XML return a singleton Hash that is not dumpable

Open HoneyryderChuck opened this issue 13 years ago • 3 comments

I'm using the parsing engine in order to get hash representation that will be serialized somewhere. In order for it to be serialized, the object cannot be singleton. Turns out, what the parsing function returns is indeed singleton, therefore, not dumpable.

quick example:



xml = '
This
is
freaky
'

Marshal.dump Crack::XML.parse(xml)



this returns: TypeError: singleton can't be dumped

Is it short-term-fixable?

Regards Tiago

HoneyryderChuck avatar Jan 27 '12 16:01 HoneyryderChuck

Hi,

investigated further, and it seems it is all because of these lines:


if t.is_a?(String)
        class 

line 85 - 90 of the xml.rb file.

Apparently, after the insertion of the attributes accessor on the t variable, t is no longer an instance of String, but a singleton instance(?) of String. Not dumpable, therefore. How to fix this? I'll investigate further, just wanted to tell u about so u could know of the issue as well.

HoneyryderChuck avatar Jan 31 '12 10:01 HoneyryderChuck

The main culprit of this issue has been (and now a quote from the Marshal class documentation for Ruby 1.x.x):

Some objects cannot be dumped: if the objects to be dumped include bindings, procedure or method objects, instances of class IO, or singleton objects, a TypeError will be raised.

the solutions, as far as i see it is, are:

  • either do it all with instance_variable_get/set methods when it comes to accessing the attributes,
  • or create a subclass that inherits from String, define the attributes accessor inside and move on from there.

what do you think?

HoneyryderChuck avatar Jan 31 '12 11:01 HoneyryderChuck

Anyone have a solution or workaround for this in the past 7 months?

mhuggins avatar Aug 13 '12 20:08 mhuggins

Seems to be fixed already

kiskoza avatar Jan 26 '24 16:01 kiskoza