aboutsummaryrefslogtreecommitdiffstats
path: root/activejob/lib/active_job/serializers.rb
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2018-02-09 15:23:05 -0500
committerRafael Mendonça França <rafaelmfranca@gmail.com>2018-02-14 13:10:07 -0500
commitea615332452e6860872020aa161c5d34e81f1eea (patch)
tree2ba5478b1e48b56f722aed17c3f6d2d5f9d1d7d9 /activejob/lib/active_job/serializers.rb
parent9bc8b4bbde4634e0e4bddcffa25e0bf8d74d19cd (diff)
downloadrails-ea615332452e6860872020aa161c5d34e81f1eea.tar.gz
rails-ea615332452e6860872020aa161c5d34e81f1eea.tar.bz2
rails-ea615332452e6860872020aa161c5d34e81f1eea.zip
Only add one more custom key in the serialized hash
Now custom serialziers can register itself in the serialized hash using the "_aj_serialized" key that constains the serializer name. This way we can avoid poluting the hash with many reserved keys.
Diffstat (limited to 'activejob/lib/active_job/serializers.rb')
-rw-r--r--activejob/lib/active_job/serializers.rb37
1 files changed, 22 insertions, 15 deletions
diff --git a/activejob/lib/active_job/serializers.rb b/activejob/lib/active_job/serializers.rb
index 41113c521c..12458ea572 100644
--- a/activejob/lib/active_job/serializers.rb
+++ b/activejob/lib/active_job/serializers.rb
@@ -1,5 +1,7 @@
# frozen_string_literal: true
+require "set"
+
module ActiveJob
# Raised when an exception is raised during job arguments deserialization.
#
@@ -34,7 +36,7 @@ module ActiveJob
autoload :StandardTypeSerializer
mattr_accessor :_additional_serializers
- self._additional_serializers = []
+ self._additional_serializers = Set.new
class << self
# Returns serialized representative of the passed object.
@@ -62,27 +64,32 @@ module ActiveJob
# Adds a new serializer to a list of known serializers
def add_serializers(*new_serializers)
- check_duplicate_serializer_keys!(new_serializers)
-
- self._additional_serializers = new_serializers + self._additional_serializers
+ self._additional_serializers += new_serializers
end
# Returns a list of reserved keys, which cannot be used as keys for a hash
def reserved_serializers_keys
- serializers.select { |s| s.respond_to?(:key) }.map(&:key)
+ RESERVED_KEYS
end
-
- private
-
- def check_duplicate_serializer_keys!(serializers)
- keys_to_add = serializers.select { |s| s.respond_to?(:key) }.map(&:key)
-
- duplicate_keys = reserved_serializers_keys & keys_to_add
-
- raise ArgumentError.new("Can't add serializers because of keys duplication: #{duplicate_keys}") if duplicate_keys.any?
- end
end
+ # :nodoc:
+ GLOBALID_KEY = "_aj_globalid".freeze
+ # :nodoc:
+ SYMBOL_KEYS_KEY = "_aj_symbol_keys".freeze
+ # :nodoc:
+ WITH_INDIFFERENT_ACCESS_KEY = "_aj_hash_with_indifferent_access".freeze
+ # :nodoc:
+ OBJECT_SERIALIZER_KEY = "_aj_serialized"
+
+ # :nodoc:
+ RESERVED_KEYS = [
+ GLOBALID_KEY, GLOBALID_KEY.to_sym,
+ SYMBOL_KEYS_KEY, SYMBOL_KEYS_KEY.to_sym,
+ WITH_INDIFFERENT_ACCESS_KEY, WITH_INDIFFERENT_ACCESS_KEY.to_sym,
+ ]
+ private_constant :RESERVED_KEYS
+
add_serializers GlobalIDSerializer,
StandardTypeSerializer,
HashWithIndifferentAccessSerializer,