2010-01-07 5 views
5

J'essaie de décongeler un BLOB de base de données qui a été gelé en utilisant Storable sur une machine Solaris (production) 64 bits. Lorsque j'essaie de décongeler sur un PC Windows (développement) 32 bits, je reçois l'erreur "L'ordre des octets n'est pas compatible".Comment utiliser Perl 32 bits pour décongeler quelque chose gelé avec 64 bits Storable?

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 

erreur exacte est:

(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) 

ligne 124 de SearchSendQueue.pm:

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

Est-ce que quelqu'un sait comment je peux dégeler cet objet sur la machine 32 bits?

Remarque: L'objet est valide et fonctionne sur la machine de production 64 bits. J'ai déjà essayé "$ Storable :: interwork_56_64bit = 1;" comme suggéré sur d'autres forums.

+1

Si c'est juste un problème de commande d'octets, vous pouvez essayer d'inverser l'ordre des octets avec pack()? – Ether

+1

Cela ne répond pas directement à votre question, mais les machines Intel 64 bits sont bon marché et Solaris est gratuit. Même si vous voulez exécuter Windows pour la plupart, une machine virtuelle Solaris peut vous aider. Je suis très heureux de pouvoir utiliser une machine pour développer sur presque toutes les plates-formes que je choisis. :) –

Répondre

8

documentation Storable dit:

Storable écrit un en-tête de fichier qui contient les tailles des différents types de langage C pour le compilateur C qui a construit stockable (lorsqu'ils ne sont pas l'écriture dans l'ordre du réseau), et refusera de charger des fichiers écrit par un Storable pas sur la même architecture (ou compatible).

Dans la même section, ils suggèrent que l'utilisation de base de Storable est une méthode locale et FAST persistance. Toutefois, vous pouvez utiliser nstore pour stocker la structure persistante dans réseau ordre des octets. Le résultat sera qu'il lit et stocke plus lentement mais fonctionne sur toutes les plates-formes. Donc, la suggestion est que vous devrez utiliser la machine 64 bits pour lire et re-stocker les données dans l'ordre réseau en utilisant nstore.

+0

Est-ce que cela fonctionne pour les espaces de 32/64-bit ou juste pour les CPU big-endian/little-endian? – fennec

+0

@fennec: Cela devrait fonctionner pour les fichiers Stable complètement portables. La section I référencée traite spécifiquement des architectures 64 bits. – Axeman

+0

J'essayais d'éviter le dégel/nfreeze sur le serveur de production. Cependant, cela semblait être le seul moyen, alors c'est ce que j'ai fini par faire. – uxnow

5

Je sais que les docs indiquent que c'est supposé être possible, mais je n'ai jamais réussi à l'obtenir, sauf en utilisant nfreeze/nstore * sur la machine 64 bits.

Questions connexes