Inconsistent serialization-getting YAML::Syck object not hash in production on DreamHost

I have a field that's serialized in my model with "serialize :field". This
works fine going back and forth to a hash in Locomotive in development.
'field' always comes out as a hash. So, in development, I get a YAML::dump
like this:

!map:HashWithIndifferentAccess
  key1: "value1"
  key2: "value2"

But, in production on DreamHost, the deseralization ends up like this:

!ruby/object:YAML::Syck::DomainType
domain: yaml.org,2002
type_id: map:HashWithIndifferentAccess
value:
  key1: "value1"
  key2: "value2"

Thus, of course, I can't use the hash methods. And Rails then generates
errors like "undefined method `include?' for
#<YAML::Syck::DomainType:0x407fb584>". And this, of course, breaks the whole
app.

I'm using Rails 1.1.6, and so is DreamHost. Does anyone have any ideas
What might be going on?

-Paul

Paul Welty wrote:

I have a field that's serialized in my model with "serialize :field". This
works fine going back and forth to a hash in Locomotive in development.
'field' always comes out as a hash. So, in development, I get a YAML::dump
like this:

!map:HashWithIndifferentAccess
  key1: "value1"
  key2: "value2"

But, in production on DreamHost, the deseralization ends up like this:

!ruby/object:YAML::Syck::DomainType
domain: yaml.org,2002
type_id: map:HashWithIndifferentAccess
value:
  key1: "value1"
  key2: "value2"

Thus, of course, I can't use the hash methods. And Rails then generates
errors like "undefined method `include?' for
#<YAML::Syck::DomainType:0x407fb584>". And this, of course, breaks the whole
app.

I'm using Rails 1.1.6, and so is DreamHost. Does anyone have any ideas
What might be going on?

-Paul

I tried "rake freeze_gems", but that doesn't have any effect.

I checked on DreamHost, and they are using Ruby 1.8.2, but Locomotive
uses 1.8.4. Could that be the problem?

-Paul

I realize I'm the only person talking in this thread, but this problem
is killing me.

I tried installing custom Ruby on DreamHost and using 1.8.4. In fact, I
created an entire custom Rails environment. But, nothing makes the
slightest difference.

So, it seems like there are different YAML::Syck modules on different
platforms. Could this be right?

If so, shouldn't someone have run into this problem before?

Try serializing a Hash instead of a HashWithIndifferentAccess.
Then you’ll get compatible YAML across Syck versions.

jeremy

Thanks! That seems to have worked. I never would have guessed that, so
I really appreciate it.

-Paul