ActiveJob::SerializationError: Unsupported argument type: Date/Class

ActiveJob::SerializationError: Unsupported argument type: Date/Class

我在使用 Sidekiq 适配器将 class 和日期传递给 A​​ctiveJob 时遇到奇怪的错误。

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'

根据 docA​​ctiveJob 应该立即支持这两种类型的参数。这里有什么问题?

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

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

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

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

您正在使用的 Rails 版本的 v5.0 doesn't explicitly specify about the arguments types supported. And looking at the source code 指南(见下文),即 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 的特定版本。