123456789_123456789_123456789_123456789_123456789_

Module: ActiveJob::Serializers

Do not use. This module is for internal use only.

Overview

The Serializers module is used to store a list of known serializers and to add new ones. It also has helpers to serialize/deserialize objects.

Class Attribute Summary

Class Method Summary

::ActiveSupport::Autoload - Extended

Class Attribute Details

.serializers (rw)

Returns list of known serializers.

[ GitHub ]

  
# File 'activejob/lib/active_job/serializers.rb', line 51

attr_reader :serializers

.serializers=(serializers) (rw)

[ GitHub ]

  
# File 'activejob/lib/active_job/serializers.rb', line 53

def serializers=(serializers)
  @serializers = serializers
  index_serializers
end

Class Method Details

.add_serializers(*new_serializers)

Adds new serializers to a list of known serializers.

[ GitHub ]

  
# File 'activejob/lib/active_job/serializers.rb', line 59

def add_serializers(*new_serializers)
  new_serializers = new_serializers.flatten
  new_serializers.map! do |s|
    if s.is_a?(Class) && s < ObjectSerializer
      s.instance
    else
      s
    end
  end

  @serializers += new_serializers
  index_serializers
  @serializers
end

.deserialize(argument)

Returns deserialized object. Will look up through all known serializers. If no serializer found will raise ArgumentError.

Raises:

  • (ArgumentError)
[ GitHub ]

  
# File 'activejob/lib/active_job/serializers.rb', line 40

def deserialize(argument)
  serializer_name = argument[Arguments::OBJECT_SERIALIZER_KEY]
  raise ArgumentError, "Serializer name is not present in the argument: #{argument.inspect}" unless serializer_name

  serializer = serializer_name.safe_constantize
  raise ArgumentError, "Serializer #{serializer_name} is not known" unless serializer

  serializer.deserialize(argument)
end

.index_serializers (private)

[ GitHub ]

  
# File 'activejob/lib/active_job/serializers.rb', line 75

def index_serializers
  @serializers_index.clear
  serializers.each do |s|
    if s.respond_to?(:klass)
      @serializers_index[s.klass] = s
    elsif s.respond_to?(:klass, true)
      klass = s.send(:klass)
      ActiveJob.deprecator.warn(<<~MSG.squish)
        #{s.class.name}#klass method should be public.
      MSG
      @serializers_index[klass] = s
    end
  end
end

.serialize(argument)

Returns serialized representative of the passed object. Will look up through all known serializers. Raises SerializationError if it can’t find a proper serializer.

Raises:

[ GitHub ]

  
# File 'activejob/lib/active_job/serializers.rb', line 31

def serialize(argument)
  serializer = @serializers_index[argument.class] || serializers.find { |s| s.serialize?(argument) }
  raise SerializationError.new("Unsupported argument type: #{argument.class.name}") unless serializer
  serializer.serialize(argument)
end