OpenStruct serialization/deserialization
An OpenStruct is a data structure, similar to a Hash, that allows the definition of arbitrary attributes with their accompanying values. This is accomplished by using Ruby's metaprogramming to define methods on the class itself.
Examples:
1 2 3 4 5 6 7 8 9 10 | require 'ostruct' person = OpenStruct. new person.name = "John Smith" person.age = 70 person.pension = 300 puts person.name # -> "John Smith" puts person.age # -> 70 puts person.address # -> nil |
An OpenStruct employs a Hash internally to store the methods and values and can even be initialized with one:
1 2 | australia = OpenStruct. new ( :country => "Australia" , :population => 20_000_000 ) p australia # -> <OpenStruct country="Australia" population=20000000> |
Hash keys with spaces or characters that would normally not be able to use for method calls (e.g. ()[]*) will not be immediately available on the OpenStruct object as a method for retrieval or assignment, but can be still be reached through the Object#send method.
1 2 3 4 5 6 7 | measurements = OpenStruct. new ( "length (in inches)" => 24 ) measurements.send( "length (in inches)" ) # -> 24 data_point = OpenStruct. new ( :queued ? => true ) data_point.queued? # -> true data_point.send( "queued?=" , false ) data_point.queued? # -> false |
Removing the presence of a method requires the execution the #delete_field method as
setting the property value to nil
will not remove the method.
1 2 3 4 5 6 7 8 | first_pet = OpenStruct. new ( :name => 'Rowdy' , :owner => 'John Smith' ) first_pet.owner = nil second_pet = OpenStruct. new ( :name => 'Rowdy' ) first_pet == second_pet # -> false first_pet.delete_field( :owner ) first_pet == second_pet # -> true |
Implementation:
An OpenStruct utilizes Ruby's method lookup structure to and find and define the necessary methods for properties. This is accomplished through the method method_missing and define_method.
This should be a consideration if there is a concern about the performance of the objects that are created, as there is much more overhead in the setting of these properties compared to using a Hash or a Struct.