1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use strict;
use warnings;
use Data::Dumper;
use IO::String;
use bytes;
my $bio = IO::String->new;
$bio->binmode();
my $h = {
'nix' => '',
'root' => {
1 => {
'1.1' => 'val_1.1',
'1.2' => 'val_1.2',
'1.3' => {
'1.3.1' => 'val_1.3.1',
'1.3.2' => 'val_1.3.2',
},
},
2 => 'val_2',
'Umlaute in UTF-8' => 'äöüß',
},
'nochn_root' => 'hat_nur_einen_Value',
};
while( my($k, $v) = each %{$h}){
serializer($k,$v);
}
sub serializer{
my $key = shift;
my $stub = shift;
my @bis = @_;
if(ref $stub eq 'HASH'){
push @bis, $key;
while(my($stubk, $stubv) = each %{$stub}){
serializer($stubk, $stubv, @bis);
}
}
else{
if(scalar @bis){
my $xbis = scalar(@bis);
$bio->print(pack('N', $xbis + 1));
foreach my $k(@bis){
$bio->print(pack('N', length($k)).$k);
}
$bio->print(pack('N', length($key)).$key);
$bio->print(pack('N', length($stub)).$stub);
}
else{
$bio->print(pack('N', 1));
$bio->print(pack('N', length($key)).$key);
$bio->print(pack('N', length($stub)).$stub);
}
}
}
$bio->seek(0,0);
my $result = {};
while(my $buffer = fread(4)){
my $xkeys = unpack('N', $buffer);
my @prekeys = ();
foreach my $i(1..$xkeys){
my $buffer = fread(4);
my $lenpk = unpack 'N', $buffer;
my $pk = $lenpk ? fread($lenpk) : '';
push @prekeys, $pk;
}
my $vlen = unpack('N', fread(4));
my $val = $vlen ? fread($vlen) : '';
stacker(\@prekeys, $result, $val);
}
print Dumper $h, $result;
sub stacker{
my ($ref, $hash, $val) = @_;
my $last = pop @$ref;
for my $el (@$ref) {
$hash = $hash->{$el} ||= {};
}
$hash->{$last} = $val;
}
sub fread{
my $len = shift;
read($bio, my $buffer, $len);
return $buffer;
}