module RLP::Sedes::Serializable::ClassMethods
Public Instance Methods
add_serializable_field(name, sedes)
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 24 def add_serializable_field(name, sedes) unless @serializable_fields # append or reset @serializable_fields = superclass.include?(Sedes::Serializable) ? superclass.serializable_fields.dup : {} end @serializable_fields[name] = sedes class_eval <<-ATTR def #{name} @#{name} end def #{name}=(v) _set_field(:#{name}, v) end ATTR end
deserialize(serial, **options)
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 69 def deserialize(serial, **options) exclude = options.delete(:exclude) begin values = serializable_sedes.deserialize(serial) rescue ListDeserializationError => e raise ObjectDeserializationError.new(serial: serial, sedes: self, list_exception: e) end params = Hash[*serializable_fields.keys.zip(values).flatten(1)] params.delete_if {|field, value| exclude.include?(field) } if exclude obj = self.new params.merge(options) obj.instance_variable_set :@_mutable, false obj end
exclude(excluded_fields)
click to toggle source
Create a new sedes considering only a reduced set of fields.
# File lib/rlp/sedes/serializable.rb, line 89 def exclude(excluded_fields) fields = serializable_fields.dup.delete_if {|k, v| excluded_fields.include?(k) } Class.new(self).tap {|cls| cls.set_serializable_fields fields } end
inherit_serializable_fields!()
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 43 def inherit_serializable_fields! @serializable_fields = superclass.serializable_fields end
serializable_fields()
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 47 def serializable_fields @serializable_fields end
serializable_sedes()
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 51 def serializable_sedes @serializable_sedes ||= Sedes::List.new(elements: serializable_fields.values) end
serialize(obj)
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 55 def serialize(obj) begin field_values = serializable_fields.keys.map {|k| obj.send k } rescue NoMethodError => e raise ObjectSerializationError.new(message: "Cannot serialize this object (missing attribute)", obj: obj) end begin serializable_sedes.serialize(field_values) rescue ListSerializationError => e raise ObjectSerializationError.new(obj: obj, sedes: self, list_exception: e) end end
set_serializable_fields(fields)
click to toggle source
# File lib/rlp/sedes/serializable.rb, line 18 def set_serializable_fields(fields) raise "Cannot override serializable fields!" if @serializable_fields @serializable_fields = {} # always reset fields.each {|name, sedes| add_serializable_field name, sedes } end