Class: FastSerializer::SerializationContext
- Inherits:
-
Object
- Object
- FastSerializer::SerializationContext
- 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
-
.current ⇒ Object
Return the current context or nil if none is in use.
-
.use ⇒ Object
Use a context or create one for use within a block.
Instance Method Summary collapse
-
#initialize ⇒ SerializationContext
constructor
A new instance of SerializationContext.
-
#load(serializer_class, object, options = nil) ⇒ Object
Returns a serializer from the context cache if a duplicate has already been created.
-
#with_reference(object) ⇒ Object
Maintain reference stack to avoid circular references.
Constructor Details
#initialize ⇒ SerializationContext
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
.current ⇒ Object
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 |
.use ⇒ Object
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, = nil) key = [serializer_class, object, ] serializer = nil if @cache serializer = @cache[key] end unless serializer serializer = serializer_class.allocate serializer.send(:initialize, object, ) @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 |