Techioz Blog

情報を失わずに Faraday::Response をシリアル化および逆シリアル化する方法はありますか?

概要

情報を失わずに Faraday::Response インスタンスをシリアル化しようとしています。 marshal_dump メソッドと marshal_load メソッドを見つけましたが、response.env.request の詳細が保持されていないようです。

response = Faraday.get('https://google.com')
response.env.request_headers
#=> {"User-Agent"=>"Faraday v2.7.4"}

response2 = Faraday::Response.new
response2.marshal_load(response.marshal_dump)
response2.env.request_headers
#=> nil

response3 = Marshal.load(Marshal.dump(response))
response3.env.request_headers
#=> nil

逆シリアル化時に両方のオブジェクトにまったく同じデータが含まれるように、すべてをシリアル化するにはどうすればよいですか?

解決策

一般に、これは実際には不可能です。たとえば、リクエストにはプロシージャである @on_complete_callbacks があり、それらはマーシャリングできません。 さらに、オブジェクトは他のオブジェクトを参照できますが、場合によっては (匿名クラスなど) それらもマーシャリングできません。

ファラデーの marshal_dump はまさにこれです

def marshal_dump
  finished? ? to_hash : nil
end

(出典: https://www.rubydoc.info/github/lostisland/faraday/Faraday/Response#marshal_dump-instance_method)

to_hash は次のとおりです。

def to_hash
  {
    status: env.status, body: env.body,
    response_headers: env.response_headers,
    url: env.url
  }
end

(出典: https://www.rubydoc.info/github/lostisland/faraday/Faraday/Response#to_hash-instance_method)

ご覧のとおり、ファラデーの開発者は、他のものはそれほど重要ではないと判断しました。

したがって、「逆シリアル化後にまったく同じになるようにシリアル化する」というショートカットは不可能なので、次のいずれかを行う必要があります。