This project is archived and is in readonly mode.

#5525 ✓resolved
Stefan Siebel

After update to Rails 3.0.0 release, serialization seems to be broken?

Reported by Stefan Siebel | September 1st, 2010 @ 10:27 PM | in 3.0.2

I updated my application to Rails 3.0.0 and noticed something I don't totally understand.

You can find the application here http://github.com/Skarabaeus/PhotoYear/tree/master/app/models

In Photo.rb I have code like this:

class Photo < ActiveRecord::Base
  serialize :style, PhotoStyle
  [...]
end

Before the update to Rails 3 what I saw in the data base was e.g.:

--- !ruby/object:PhotoStyle
a: !ruby/object:StyleElement 
  selector: a
  style: 
    color: "#858585"
body: !ruby/object:StyleElement 
  selector: body
  style: 
    background-color: "#000"
    color: "#d1d3eb"
theimage: !ruby/object:StyleElement 
  selector: "#theimage"
  style: 
    border: "0"
    box-shadow: "1px 3px 15px [#555](/projects/8994/tickets/555 "Ticket #555")"

Now, when I create a new Photo or update an existing one, I see:

#<PhotoStyle:0xb6e127b8>

When I try to load such a record I am getting an exception:

"style was supposed to be a PhotoStyle, but was a String. "

I checked the Rails 3 release notes, but didn't notice anything about the serialize method except "ActiveSupport::OrderedHash now can de-serialize through YAML."

I totally might be I'm overseeing something here. Any idea what?

Thanks!

Comments and changes to this ticket

  • Stefan Siebel

    Stefan Siebel September 1st, 2010 @ 10:29 PM

    H Aaron, I set you as "who is responsible" because you helped me last time with it :-) (https://rails.lighthouseapp.com/projects/8994/tickets/5002-nested-o.... I hope it's not yet another thing I didn't get right!

  • Neeraj Singh

    Neeraj Singh September 2nd, 2010 @ 05:38 AM

    • State changed from “new” to “needs-more-info”
    • Importance changed from “” to “Low”

    I am not able to reproduce it.

    This is what I did with rails 2.3.8

    class User < ActiveRecord::Base
      serialize :data
    end
    
    >> u = User.first
    >> u.data = {:foo => :bar}
    => {:foo=>:bar}
    
    # the sql was
    UPDATE `users` SET `updated_at` = '2010-09-02 04:31:35', `data` = '--- \n:foo: :bar\n' WHERE `id` = 1
    

    Then I switched to rails edge. I used mysql database to do this test.

    > u = User.first
    > u.data
      => {:foo=>:bar}
    

    As you can see data looks fine to me.

    I added just simple hash. I would suggest you to add more complex data structure incrementally and then see if it fails for some case. Once I had an issue with openstruct. The yaml could not be deserialized.

  • Stefan Siebel

    Stefan Siebel September 2nd, 2010 @ 03:37 PM

    Hi Neeraj, thank you for your answer. Using a Hash indeed works. I attached a minimum example which reproduces the error for me. I am using Ruby 1.8.7 and Rails 3.0.0.

    In user_test.rb I added a test like this:

    test "try to save a User and load it" do
      a = User.new
      a.pref = MyClass.new
      a.save!
    
      b = User.last
    
      assert b.pref.class == 'MyClass'
    end
    

    When running the test I get:

    Loaded suite unit/user_test
    Started
    E
    Finished in 0.181865 seconds.
    
    1) Error:
    test_try_to_save_a_User_and_load_it(UserTest):
    ActiveRecord::SerializationTypeMismatch: pref was supposed to be a MyClass, but was a String
    
    
    1 tests, 0 assertions, 0 failures, 1 errors
    

    I am on vacation for the next two weeks and don't really have internet access for this time. So my next replay to this ticket might take a while ;-)

  • Santiago Pastorino

    Santiago Pastorino September 5th, 2010 @ 02:02 AM

    • Milestone cleared.
    • State changed from “needs-more-info” to “open”
  • reaper

    reaper September 5th, 2010 @ 12:37 PM

    +1 for me.

    I'm using the exifr gem to pull exif data from images and then store that info in the database. I have exactly the same problem where it appears my object is being run through to_str instead of to_yaml before getting stored in the database (so all entries end up looking like the following):

    #<EXIFR::JPEG:0x00000107118a70>
    
    Personally I think this should be a higher priority than Low since it worked before, but is actually silently failing now. Entries end up in the database, but the data isn't really there. Anyone using this to store any kind of important data (like IPN responses from a payment gateway, etc) will be in for a rude awakening when they go to access the data and find all they have is garbage.
  • Repository

    Repository September 7th, 2010 @ 09:39 PM

    • State changed from “open” to “resolved”

    (from [b1c104296e71799e0cb69aaab321245a98c78dec]) serialized attributes should be serialized before validation [#5525 state:resolved] http://github.com/rails/rails/commit/b1c104296e71799e0cb69aaab32124...

  • Repository
  • MarianTheisen

    MarianTheisen October 7th, 2010 @ 01:52 PM

    • Assigned user cleared.

    ran into this bug today, extremely dirty workaround:

    since serialization for Hash, Array etc is working, wrap your attribute in an array

    class Order < ActiveRecord
      serialize :items


    def items= items

    write_attribute :items, [items]
    
    
    
    
    end
    def items
    read_attribute(:items).first
    
    
    
    
    end end
  • Jeremy Kemper

    Jeremy Kemper October 15th, 2010 @ 11:02 PM

    • Milestone set to 3.0.2
  • Ivo Wever

    Ivo Wever November 9th, 2010 @ 02:00 PM

    The linked patch alone does not seem enough to solve this issue: I've create a patched version of 3.0.1 with those patches applied and the serialization still fails.
    Failing spec:

        it "should serialize the output to YAML when stored (issue 2196)" do

      class MyCustomClass
      end
      impl_output.output = MyCustomClass.new
      impl_output.save!
      impl_output.reload
      impl_output.output_before_type_cast.should ==
          &quot;--- !ruby/object:MyCustomClass {}\n\n&quot;
    end</code>
    
    
    
    
  • Ivo Wever

    Ivo Wever November 9th, 2010 @ 02:29 PM

    Sorry, I retract my previous comment: I just verified that the fix works just fine.

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

Attachments

Referenced by

Pages