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