【问题标题】:How can I use 32-bit Perl to thaw something frozen with 64-bit Storable?如何使用 32 位 Perl 解冻使用 64 位 Storable 冻结的内容?
【发布时间】:2010-01-07 06:04:47
【问题描述】:

我正在尝试解冻在 64 位 Solaris(生产)机器上使用 Storable 冻结的数据库 BLOB。当我尝试在 32 位 Windows(开发)PC 上解冻时,我收到“字节顺序不兼容错误”。

perl -v (on solaris)
This is perl, v5.8.8 built for i86pc-solaris-64

perl -v (on Windows)
This is perl, v5.10.1 built for MSWin32-x86-multi-thread

确切的错误是:

(Unable to read: Byte order is not compatible at blib\lib\Storable.pm (autosplit into  blib\lib\auto\Storable\thaw.al) line 415, at ../handlers/Search/actions/SearchSendQueue.pm line 124 )

SearchSendQueue.pm 的第 124 行:

my $object = thaw( $item->{object} );

有人知道如何在 32 位机器上解冻这个对象吗?

注意:该对象是有效的,并且在 64 位生产机器上工作。 我已经尝试过“$Storable::interwork_56_64bit = 1;”按照其他论坛的建议。

【问题讨论】:

  • 如果只是字节序问题,你可以试试用 pack() 反转字节序?
  • 这并不能直接回答您的问题,但 64 位 Intel 机器很便宜,而 Solaris 是免费的。即使您想主要运行 Windows,Solaris 虚拟机也可以提供帮助。我很高兴我可以使用一台机器在我选择的几乎任何平台上进行开发。 :)

标签: perl endianness storable


【解决方案1】:

Storable 文档说:

Storable 为构建 Storable 的 C 编译器写入一个包含各种 C 语言类型的大小的文件头(当不按网络顺序编写时),并且将拒绝加载由不同的 Storable 编写的文件(或兼容) 架构。

在同一部分,他们建议 Storable 的基本用途是本地和FAST 持久性方法。但是,您可以使用 nstorenetwork 字节顺序存储持久结构。结果将是它读取和存储速度较慢,但​​适用于所有平台。

因此建议您必须使用 64 位机器使用 nstore 以网络顺序读取和重新存储数据。

【讨论】:

  • 这适用于 32/64 位间隙还是仅适用于大端/小端 CPU?
  • @fennec:这应该适用于完全可移植的可存储文件。我引用的部分专门处理 64 位架构。
  • 我试图避免在生产服务器上解冻/nfreeze。然而,这似乎是唯一的方法,所以这就是我最终要做的。
【解决方案2】:

我知道文档表明它应该是可能的,但除了在 64 位机器上使用 nfreeze/nstore* 之外,我一直无法让它工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2011-03-03
    • 2014-06-09
    • 2021-02-08
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多