Class: Dalli::Protocol::ValueSerializer

Inherits:
Object
  • Object
show all
Defined in:
lib/dalli/protocol/value_serializer.rb

Overview

Dalli::Protocol::ValueSerializer compartmentalizes the logic for managing serialization and deserialization of stored values. It manages interpreting relevant options from both client and request, determining whether to serialize/deserialize on store/retrieve, and processes bitflags as necessary.

Constant Summary collapse

DEFAULTS =
{
  serializer: Marshal
}.freeze
OPTIONS =
DEFAULTS.keys.freeze
FLAG_SERIALIZED =

www.hjp.at/zettel/m/memcached_flags.rxml Looks like most clients use bit 0 to indicate native language serialization

0x1

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(protocol_options) ⇒ ValueSerializer

Returns a new instance of ValueSerializer.



24
25
26
27
# File 'lib/dalli/protocol/value_serializer.rb', line 24

def initialize(protocol_options)
  @serialization_options =
    DEFAULTS.merge(protocol_options.select { |k, _| OPTIONS.include?(k) })
end

Instance Attribute Details

#serialization_optionsObject

Returns the value of attribute serialization_options.



22
23
24
# File 'lib/dalli/protocol/value_serializer.rb', line 22

def serialization_options
  @serialization_options
end

Instance Method Details

#retrieve(value, bitflags) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/dalli/protocol/value_serializer.rb', line 36

def retrieve(value, bitflags)
  serialized = (bitflags & FLAG_SERIALIZED) != 0
  if serialized
    begin
      serializer.load(value)
    rescue StandardError
      raise UnmarshalError, 'Unable to unmarshal value'
    end
  else
    value
  end
end

#serialize_value(value) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/dalli/protocol/value_serializer.rb', line 53

def serialize_value(value)
  serializer.dump(value)
rescue Timeout::Error => e
  raise e
rescue StandardError => e
  # Serializing can throw several different types of generic Ruby exceptions.
  # Convert to a specific exception so we can special case it higher up the stack.
  exc = Dalli::MarshalError.new(e.message)
  exc.set_backtrace e.backtrace
  raise exc
end

#serializerObject



49
50
51
# File 'lib/dalli/protocol/value_serializer.rb', line 49

def serializer
  @serialization_options[:serializer]
end

#store(value, req_options, bitflags) ⇒ Object



29
30
31
32
33
34
# File 'lib/dalli/protocol/value_serializer.rb', line 29

def store(value, req_options, bitflags)
  do_serialize = !(req_options && req_options[:raw])
  store_value = do_serialize ? serialize_value(value) : value.to_s
  bitflags |= FLAG_SERIALIZED if do_serialize
  [store_value, bitflags]
end