Wie (de)serialisiere ich Datenstrukturen?

Inhalt:

Problem

Du hast einen komplexen Hash, ein Array oder eine sonstige beliebige Datenstruktur in Perl. Du möchtest diese Struktur gerne abspeichern und beim nächsten Programmstart wieder einlesen. Evtl. möchtest du aber auch die serialisierte Struktur in einm Texteditor editieren können. Es gibt verschiedene Module mit verschiedenen Funktionen.

Module

Data::Dumper

Das Standard-Modul macht auf denkbar einfache Weise aus einer Perl-Variablen Perl-Code, den man in eine Datei speichern kann und der mittels require z.B. wieder eingelesen werden kann. Idiotensicher, jedoch leicht manipulierbar; jemand mit Zugriff auf die Datei könnte auch beliebigen Perl-Code hineinschreiben. In diesen Fällen sollte möglichst Safe::rdo oder Safe::reval statt require oder eval verwendet werden.

use Data::Dumper;
print Dumper $hashref;

# Ausgabe:
$VAR1 = {
          'Alter' => 'uralt',
          'Name' => 'ich',
          'Lieblingsfarben' => [
                                 'Rot',
                                 'Weiß',
                                 'Blau'
                               ]
        };

# datei
print FILE Data::Dumper->Dump([$hashref], ['dump']);
# ...
my $dump = require 'file';

Es kann mittlerweile auch Code-Referenzen speichern, für Details siehe die Manpage.

YAML

use YAML;
# eine Hash-Referenz laden
my ($hashref) = Load(<<'...');
---
Name: ich
Alter: uralt
# kommentar
Lieblingsfarben:
    - Rot
    - Weiß
    - Blau
...

print Dump($hashref);

Ein Vorteil von YAML ist: es ist sprach-unabhängig. Es existieren mittlerweile YAML-Libraries für python, ruby, C, java, javascript...

Ein Nachteil: die Perl-Implementation YAML.pm ist leider noch recht buggy. Für einfache Konfigurationsdateien sollte es aber immer reichen.

Für einfache YAML-Dateien kann auch das Modul YAML::Tiny verwendet werden. Es ist ziemlich schnell und für die meisten Fälle ausreichend.

Storable

Das Modul serialisiert ein Datenstruktur in ein binäres Format. Ein Nachteil ist, dass es zwischen bestimmten Versionen nicht kompatibel ist. Vorteil: Auf Wunsch nimmt es einem auch das File-Locking ab.

use Storable;
store \%table, 'file';
$hashref = retrieve('file');

$serialized = freeze \%table;
%table_clone = %{ thaw($serialized) };

Es kann mittlerweile auch Code-Referenzen speichern, für Details siehe die Manpage.

Wenn man Storable-Dateien zwischen verschiedenen Rechnerarchitekturen austauschen will, sollte man statt store das portable nstore verwenden.

XML::Simple

Einfaches Serialisieren in XML. Wichtig ist, dass man keine zu hohen Ansprüche an das XML hat, da ein von XML::Simple eingelesenes XML ganz anders aussehen kann als das, was herauskommt.

Data::Dump::Streamer

Kommentare?

Data::Denter

Ein Vorgänger von YAML. Sollte heute nicht mehr verwendet werden.

XML::Dumper

Während XML::Simple versucht, das serialisierte Format recht kompakt zu halten, wird die Ausgabe bei XML::Dumper ziemlich aufgebläht. Man hat aber anders als bei XML::Simple die Sicherheit, dass man bei Serialisierung und Deserialisierung immer das Richtige erhält.

Data::Serializer

Ein Meta-Klasse, die die verschiedenen hier aufgeführten Serialisierer unter einen Hut bringt und zudem noch Verschlüsselung, Kompression und Checksummen anbietet.

FreezeThaw?

Alt und langsam. Sollte man nicht verwenden.

Übersicht

Name Standard Format Datentypen
Data::Dumper ab 5.5 plaintext, Perl-Code Hashes, Arrays, Skalare, Objekte, (Codereferenzen)
YAML - plaintext, Einrückungen Hashes, Arrays, Skalare, Objekte
Storable ab 5.7.3 binär Hashes, Arrays, Skalare, Objekte, (Codereferenzen)
XML::Simple - XML Hashes, Arrays, Skalare

Ergänzungen, Kommentare

Weitere Module ergänzt.

-- PlTk - 12 Aug 2005

Kommentare werden am besten in folgender Form vorgenommen, damit sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff

UtilFaqSubForm edit

Titel Wie (de)serialisiere ich Datenstrukturen?
Autor TinaMueller
Bereich FaqEinUndAusgabe
Tags
Topic revision: r3 - 2007-07-24 - 09:44:00 - ReneeBaecker
 
Bitte die NutzungsBedingungen beachten.
Bei Vorschlägen, Anfragen oder Problemen mit dem PerlCommunityWiki bitten wir um WebBottomBarExample">Rückmeldung.