2010-10-11 2 views
1

Quel est le meilleur module ou approche pour sérialiser les données dans une base de données?Comment puis-je sérialiser et désérialiser les données Perl dans/depuis la base de données?

Actuellement, je suis à la recherche en fonctions mémorisables freeze et thaw, par exemple:

use Storable qw(freeze thaw); 
use strict; 

my %array_test = ('Year Average' => 0.1, 'Color Average' => 0.8, 'Humans' => 0, 'Units' => 1); 
my $serialized_data = freeze(\%array_test); 
my %deserialized_data = %{ thaw($serialized_data) }; 

Ce que je voudrais savoir:

  1. Existe-t-il une commande native en Perl pour sérialiser et désérialiser des données?
  2. Est-ce que Storable est une bonne approche pour sérialiser et désérialiser dans une base de données ou y at-il une meilleure approche/modules autour?
  3. Devrais-je faire autre chose avec la sérialisation avant de le stocker, comme l'encoder?
+3

Utilisez nfreeze, pas gel, pour quoi que ce soit non-transitoire. – ysth

Répondre

2

Les réponses dépendent du type de données que vous devez sérialiser.

  1. natif: il y a paquet/déballer, pour les tableaux numériques simples que vous pouvez joindre par des virgules, etc ... Toutes les méthodes simples sont natifs domaine très spécifiques et ne sont pas applicables aux données génériques.

  2. Storable est une bonne approche standard. Il y en a d'autres (j'ai entendu parler de FreeseThaw mais jamais utilisé). Vous pouvez également faire le formatage YAML ou JSON - pour les comparaisons, veuillez voir un StackOverflow question récent sur l'envoi d'un tableau de données sur IO :: Socket :: INET (qui implique également la sérialisation).

  3. Le codage supplémentaire dépend de la sérialisation que vous effectuez et de ce que vous faites des données.

    E.g. Si la sérialisation préserve les chaînes de texte brut et que ces chaînes peuvent contenir des guillemets et que vous utilisez les données sérialisées au milieu d'une instruction SQL (au lieu de lier les variables), vous devez encoder les guillemets.

+0

Merci, ça aide beaucoup ... Faut-il désinfecter ce que je sérialise? Je veux dire, est-il facile de casser la sérialisation d'une certaine façon? – Prix

+0

@Prix - dépend de la sérialisation et de ce que vous voulez désinfecter et comment.La plupart des schémas de codage normaux sont 100% sans perte, donc le résultat de unseialize (decode (encoder (serialize (D)))) sera la donnée originale D (par exemple, regarder le codage URI, ou échapper des citations dans une donnée CSV) . – DVK

+0

Sur le sujet que vous mentionnez pouvez-vous confirmer que le lien est celui-ci http://stackoverflow.com/questions/2824363/how-can-i-share-perl-data-structures-through-a-socket et si c'est le cas il dans votre réponse pour plus de référence à d'autres qui peuvent le rencontrer? merci – Prix

2

Qu'est-ce que vous essayez de sérialiser? Il y a beaucoup de modules Perl qui peuvent gérer ce genre de choses, mais chacun d'entre eux a des défauts. J'ai un chapitre dans Maîtriser Perl à ce sujet, mais il y a aussi le comparison of serializers des Indonésiens Perl mongers.

Si c'est vraiment juste des chaînes, comme vous le montrez, alors la plupart des choses peuvent gérer vos données. Si vous voulez stocker des éléments tels que des références de code ou des objets Perl, vous avez plus de difficulté. Cependant, une chose à considérer est que vous ne voulez pas nécessairement limiter vos données à Perl. Si un programme dans une autre langue veut obtenir vos données, quelque chose comme YAML ou JSON est beaucoup plus amical. Je déteste faire des choses qui me verrouillent dans les décisions futures, donc je ne préfère pas les solutions Perl seulement, sauf si j'en ai vraiment besoin.

Faites attention aux personnes qui répondent avant de savoir ce que vous voulez stocker. :)

+0

+ un joli lien et des infos merci. – Prix

Questions connexes