Class: FastSerializer::SerializationContext

Inherits:
Object
  • Object
show all
Defined in:
lib/fast_serializer/serialization_context.rb

Overview

This class provides a context for creating serializers that allows duplicate serializers to be re-used within the context. This then short circuits the serialization process on the duplicates.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSerializationContext

Returns a new instance of SerializationContext.



29
30
31
32
# File 'lib/fast_serializer/serialization_context.rb', line 29

def initialize
  @cache = nil
  @references = nil
end

Class Method Details

.currentObject

Return the current context or nil if none is in use.



24
25
26
# File 'lib/fast_serializer/serialization_context.rb', line 24

def current
  Thread.current[:fast_serializer_context]
end

.useObject

Use a context or create one for use within a block. Any serializers based on the same object with the same options within the block will be re-used instead of creating duplicates.



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/fast_serializer/serialization_context.rb', line 10

def use
  if Thread.current[:fast_serializer_context]
    yield
  else
    begin
      Thread.current[:fast_serializer_context] = new
      yield
    ensure
      Thread.current[:fast_serializer_context] = nil
    end
  end
end

Instance Method Details

#load(serializer_class, object, options = nil) ⇒ Object

Returns a serializer from the context cache if a duplicate has already been created. Otherwise creates the serializer and adds it to the cache.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/fast_serializer/serialization_context.rb', line 37

def load(serializer_class, object, options = nil)
  key = [serializer_class, object, options]
  serializer = nil
  if @cache
    serializer = @cache[key]
  end

  unless serializer
    serializer = serializer_class.allocate
    serializer.send(:initialize, object, options)
    @cache ||= {}
    @cache[key] = serializer
  end

  serializer
end

#with_reference(object) ⇒ Object

Maintain reference stack to avoid circular references.



55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/fast_serializer/serialization_context.rb', line 55

def with_reference(object)
  if @references
    raise CircularReferenceError.new(object) if @references.include?(object)
  else
    @references = []
  end

  begin
    @references.push(object)
    yield
  ensure
    @references.pop
  end
end