情報を失わずに 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)
ご覧のとおり、ファラデーの開発者は、他のものはそれほど重要ではないと判断しました。
したがって、「逆シリアル化後にまったく同じになるようにシリアル化する」というショートカットは不可能なので、次のいずれかを行う必要があります。