class FastSerializer::SerializationContext

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.

Public Class Methods

current() click to toggle source

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

# File lib/fast_serializer/serialization_context.rb, line 26
def current
  Thread.current[:fast_serializer_context]
end
new() click to toggle source
# File lib/fast_serializer/serialization_context.rb, line 31
def initialize
  @cache = nil
  @references = nil
end
use() { || ... } click to toggle source

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.

# File lib/fast_serializer/serialization_context.rb, line 12
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

Public Instance Methods

load(serializer_class, object, options = nil) click to toggle source

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

# File lib/fast_serializer/serialization_context.rb, line 39
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) { || ... } click to toggle source

Maintain reference stack to avoid circular references.

# File lib/fast_serializer/serialization_context.rb, line 57
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