【问题标题】:ActiveJob::SerializationError: Unsupported argument type: Date/ClassActiveJob::SerializationError:不支持的参数类型:日期/类
【发布时间】:2021-07-26 12:48:51
【问题描述】:

我在使用 Sidekiq 适配器将课程和日期传递给 ActiveJob 时遇到一个奇怪的错误。

1] pry(main)> StripeTransactionsSyncJob.perform_later(Stripe::SyncCharges, nil, 3.days.ago.to_date)
ActiveJob::SerializationError: Unsupported argument type: Class
from /home/amit/.rvm/gems/ruby-2.5.8@immosite/gems/activejob-5.0.7.2/lib/active_job/arguments.rb:83:in `serialize_argument'
[2] pry(main)> StripeTransactionsSyncJob.perform_later('Stripe::SyncCharges', nil, 3.days.ago.to_date)
ActiveJob::SerializationError: Unsupported argument type: Date
from /home/amit/.rvm/gems/ruby-2.5.8@immosite/gems/activejob-5.0.7.2/lib/active_job/arguments.rb:83:in `serialize_argument'

根据docActiveJob 应该支持这两种类型的参数。这里有什么问题?

【问题讨论】:

    标签: serialization ruby-on-rails-5 sidekiq rails-activejob


    【解决方案1】:

    您在帖子中引用的guide 指的是Rails 的v6.1.4。查看该页面右上角的版本信息。

    v5.0 的指南没有明确指定支持的参数类型。查看source code(见下文)您正在使用的Rails 版本,即5.0.7.2

      def serialize_argument(argument)
        case argument
        when *TYPE_WHITELIST
          argument
        when GlobalID::Identification
          convert_to_global_id_hash(argument)
        when Array
          argument.map { |arg| serialize_argument(arg) }
        when ActiveSupport::HashWithIndifferentAccess
          result = serialize_hash(argument)
          result[WITH_INDIFFERENT_ACCESS_KEY] = serialize_argument(true)
          result
        when Hash
          symbol_keys = argument.each_key.grep(Symbol).map(&:to_s)
          result = serialize_hash(argument)
          result[SYMBOL_KEYS_KEY] = symbol_keys
          result
        else
          raise SerializationError.new("Unsupported argument type: #{argument.class.name}")
        end
      end
    

    您传递的参数类型 ClassDate 不受支持,因此您将获得 SerializationError

    注意:每当参考 API 文档或指南时,我建议您查看它们以了解您正在使用的特定版本的 Rails。

    【讨论】:

      【解决方案2】:

      Rails 5.0 不支持 Class/Date/DateTime/Time 等。所以我需要使用String 形式的数据传递给Job。

      作为参考,这里是进行反序列化的方法(简化)

      def serialize_argument(argument)
        case argument
        when *[ NilClass, String, Integer, Float, BigDecimal, TrueClass, FalseClass ]
          argument
        when GlobalID::Identification
          convert_to_global_id_hash(argument)
        when Array
          argument.map { |arg| serialize_argument(arg) }
        when ActiveSupport::HashWithIndifferentAccess
          result = serialize_hash(argument)
          result[WITH_INDIFFERENT_ACCESS_KEY] = serialize_argument(true)
          result
        when Hash
          symbol_keys = argument.each_key.grep(Symbol).map(&:to_s)
          result = serialize_hash(argument)
          result[SYMBOL_KEYS_KEY] = symbol_keys
          result
        else
          raise SerializationError.new("Unsupported argument type: #{argument.class.name}")
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2017-04-15
        • 2015-06-23
        • 2017-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多