GAE/JRubyでmemcacheに日本語を格納すると文字化けする件

 こんにちは。那由多屋の加藤です。

 本日のエントリ「GAE/JRubyでハマったところ」に書いた「memcacheに日本語を格納すると文字化けする」件について、進展がありました。

 というか、下記のページに、ずばり不具合の原因が書かれていました。データストアの文字化けが主題ですが、memcacheについても述べられています。

appengine-apis の memcache.rb を読み込むと Datastore に格納する日本語が文字化けする - milk1000cc

 上記のページはappengine-apis 0.0.6についての内容ですが、memcacheについては0.0.12でも同様でした。下記のモンキーパッチで文字化けが無くなります。

module AppEngine
  class Memcache
    def memcache_value(obj)
      case obj
      when Fixnum
        java.lang.Long.new(obj)
      when Float
        java.lang.Double.new(obj)
      when TrueClass, FalseClass
        java.lang.Boolean.new(obj)
      when JavaProxy, Java::JavaObject
        obj
      else
        if obj.class == String
          # Convert plain strings to Java strings
          #obj.to_java_string       # delete
          java.lang.String.new(obj) # add
        else
          bytes = Marshal.dump(obj).to_java_bytes
          java.util.ArrayList.new([MARSHAL_MARKER.to_java_string, bytes])
        end
      end
    end
  end
end