如何在java中解组ruby对象?

我有一个对象,我想抓住java中的内容。 唯一的问题是目前是ruby。

irb(main):050:0> blah => "BAh7ByIeYXV0aGVudGljYXRpb25fc3RyYXRlZ2llczAiCXVzZXJpBg%253D%253D-\ -0cdecf4edfaa5cbe4693c9fb83b204c1256a54a6" irb(main):049:0> Marshal.load(Base64.decode64(blah)) => {"authentication_strategies"=>nil, "user"=>1} 

我得到了base64部分 – 所以现在一切都以字节为单位。 我如何访问第二个字符串? 我认为可以用jruby完成一些事情,但我以前从未使用它,也不知道从哪里开始。

让我在这里详细说明我的问题。

1)这些是我试图在tomcat上的servlet和apache上的merb应用程序之间共享的cookie

2)我不打算将它们存储在数据库中。 我曾考虑在memcached中使用它们,但出于其他原因我想将它们存储为cookie(是的,我很清楚所涉及的安全隐患)

我目前正在寻找jruby的Red Bridge / jruby-embed,但是因为这只有70个字节,所以我需要看一下,我觉得把所有这些开销用于这么简单的事情是荒谬的。

而不是启动一个新的问题….我现在的代码看起来像这样:

  // using commons Base64 b64 = new Base64(); byte[] decoded = b64.decode(cookie.getValue().getBytes()); ScriptingContainer container = new ScriptingContainer(); container.runScriptlet("la = Marshal.load(\"" + decoded + "\"); puts la.to_s;"); 

显然这不会起作用因为元帅将检查解码的前2个字节并且因为它与jruby的主要/次要版本不匹配而疯狂…. hrmss ..

对于不涉及JRuby的解决方案,为什么不自行序列化您感兴趣的字段? 例如,将它们作为原始字符串保存到文件或关系数据库中?

我意识到这可能不能完全回答这个问题,但可能是你以前没有想过的可能性!

编辑feydr明确表示他不是在谈论将对象数据序列化到文件中。 因此,我认为序列化用于进程间通信 ,在这种情况下,通过套接字提供的二进制协议(或任何协议)是一个很好的解决方案并且易于实现。 你可能会比看看谷歌协议缓冲区更糟糕(它甚至可以在Java端进行代码生成)。

好! 这就是我所做的。 让我重新迭代我的全部目的是从merb到在tomcat下运行的servlet的cookie会话。

 import java.io.*; import java.util.*; import org.jruby.embed.ScriptingContainer; import org.apache.commons.codec.binary.Base64; import javax.servlet.*; import javax.servlet.http.*; public class process extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(true); PrintWriter out = response.getWriter(); Cookie[] cookies = request.getCookies(); for(int i=0; i 

显然,这段代码可以被清理很多 - 例如:将base64解码移回java - 但这将从merb获得一个cookie。 现在我只需要在那里抛出validation器以确保它不是伪造的。

谢谢大家的建议!

您还可以考虑使用可用于Ruby和Java (以及C ++和Python)的Google协议缓冲区。