如何使用 PHP 解组 Ruby 对象
How to unmarshal Ruby object with PHP
编组数据在 redis 服务器中,我需要使用 PHP 访问它。没有其他选择。
据我所知,Ruby 的 PHP 内部 Marshal 格式没有解串器。当然可以写一个here's the documentation.
此外,如果 Ruby 对象使用了 PHP 所缺乏的特征,则可能无法将 Ruby 对象表示为 PHP 对象。无论哪种方式,您可能都必须在 PHP 中重新实现 Ruby 对象模型的重要部分,以便反序列化 Ruby Marshal 字符串。例如,如果在解码字符串后,您最终得到一个对象,该对象是 UserFoo
的一个实例,其中 3 个实例变量引用 class MyBar
的实例?
无论如何,这里有一系列博客文章可以帮助您入门:
- A little dip into Ruby's Marshal format
- Another dip into Ruby's Marshal format
- A final dip into Ruby's Marshal format
您 可以 尝试的一件事是 运行 您的 PHP JVM 代码使用 [=35= 的现有 JVM 实现之一](例如 Quercus 或 P8)和 embed an instance of JRuby 在您的应用程序中反序列化字符串,前提是该字符串可以使用 JRuby 反序列化。 (同样,您可以在 CLI 上对 IronPHP 和 IronRuby 执行相同的操作。)
您需要使用另一种格式(这更容易,因为您不需要编写自己的解组库)而不是 ruby 内部编组,例如 JSON、XML等等
或者您可以简单地从 php 执行 ruby 脚本,解组 ruby 对象。
编组数据在 redis 服务器中,我需要使用 PHP 访问它。没有其他选择。
据我所知,Ruby 的 PHP 内部 Marshal 格式没有解串器。当然可以写一个here's the documentation.
此外,如果 Ruby 对象使用了 PHP 所缺乏的特征,则可能无法将 Ruby 对象表示为 PHP 对象。无论哪种方式,您可能都必须在 PHP 中重新实现 Ruby 对象模型的重要部分,以便反序列化 Ruby Marshal 字符串。例如,如果在解码字符串后,您最终得到一个对象,该对象是 UserFoo
的一个实例,其中 3 个实例变量引用 class MyBar
的实例?
无论如何,这里有一系列博客文章可以帮助您入门:
- A little dip into Ruby's Marshal format
- Another dip into Ruby's Marshal format
- A final dip into Ruby's Marshal format
您 可以 尝试的一件事是 运行 您的 PHP JVM 代码使用 [=35= 的现有 JVM 实现之一](例如 Quercus 或 P8)和 embed an instance of JRuby 在您的应用程序中反序列化字符串,前提是该字符串可以使用 JRuby 反序列化。 (同样,您可以在 CLI 上对 IronPHP 和 IronRuby 执行相同的操作。)
您需要使用另一种格式(这更容易,因为您不需要编写自己的解组库)而不是 ruby 内部编组,例如 JSON、XML等等
或者您可以简单地从 php 执行 ruby 脚本,解组 ruby 对象。