Module: RLP::Sedes::Serializable::ClassMethods

Includes:
Error
Defined in:
lib/rlp/sedes/serializable.rb

Instance Method Summary collapse

Instance Method Details

#deserialize(serial, **options) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/rlp/sedes/serializable.rb', line 66

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) ⇒ Object

Create a new sedes considering only a reduced set of fields.



86
87
88
89
# File 'lib/rlp/sedes/serializable.rb', line 86

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!Object



37
38
39
# File 'lib/rlp/sedes/serializable.rb', line 37

def inherit_serializable_fields!
  @serializable_fields = superclass.serializable_fields
end

#serializable_fieldsObject



41
42
43
# File 'lib/rlp/sedes/serializable.rb', line 41

def serializable_fields
  @serializable_fields
end

#serializable_sedesObject



45
46
47
# File 'lib/rlp/sedes/serializable.rb', line 45

def serializable_sedes
  @serializable_sedes ||= Sedes::List.new(elements: serializable_fields.values)
end

#serialize(obj) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rlp/sedes/serializable.rb', line 49

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
    puts "Serializable.serialize"
    puts e
    puts e.backtrace[0,20].join("\n")
    raise ObjectSerializationError.new(obj: obj, sedes: self, list_exception: e)
  end
end

#set_serializable_fields(fields) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/rlp/sedes/serializable.rb', line 19

def set_serializable_fields(fields)
  raise "Cannot override serializable fields!" if @serializable_fields

  @serializable_fields = fields

  fields.keys.each do |field|
    class_eval "      def \#{field}\n        @\#{field}\n      end\n\n      def \#{field}=(v)\n        _set_field(:\#{field}, v)\n      end\n    ATTR\n  end\nend\n"