ActiveJob::SerializationError:不支持的参数类型:日期/类

我在使用 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',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 应该支持两种开箱即用的参数。这里有什么问题?

lizheng19860920 回答:ActiveJob::SerializationError:不支持的参数类型:日期/类

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

v5.0 的指南没有明确指定支持的参数类型。并查看您正在使用的 Rails 版本的 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。

,

Rails 5.0 不支持 Class/Date/DateTime/Time 等。所以我需要使用 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
本文链接:https://www.f2er.com/35455.html

大家都在问