NAME
AnyEvent::Sereal - Sereal stream serializer/deserializer for AnyEvent
SYNOPSIS
use AnyEvent::Sereal;
use AnyEvent::Handle;
my $hdl = AnyEvent::Handle->new(
# settings...
);
$hdl->push_write(sereal => [ 1, 2, 3 ]);
$hdl->push_read(sereal => sub {
my($hdl, $data) = @_;
# $data is [ 1, 2, 3 ]
});
# Can pass L<Sereal::Encoder> options to C<push_write>
$hdl->push_write(sereal => 'a' x 1_000, { snappy => 1 });
# And pass L<Sereal::Decoder> options to C<push_read>
$hdl->push_read(sereal => { refuse_snappy => 1 }, sub { ... });
DESCRIPTION
AnyEvent::Sereal is Sereal serializer/deserializer for AnyEvent.
The maximum size of serialized (and possibly compressed) data is specified by the variable $AnyEvent::Sereal::SERIALIZED_MAX_SIZE
. It defaults to 1_000_000 bytes. In case received data seems to contain more than this number of bytes, an error Errno::E2BIG
is given to the error handler.
The serializer options has to be passed for the first push_write
call only, otherwise a new serializer will be instanciated internally and a performance penalty will occur.
The same applies for the deserializer options and the first push_read
or unshift_read
calls.
See Implementation below for details.
IMPLEMENTATION
To be fast, the serializer stores a Sereal::Encoder instance in the _sereal_encoder
attribute of the AnyEvent::Handle instance.
Each time the serializer receives options via push_write
, a new Sereal::Encoder object is instanciated and the previous one is destroyed. When push_write
is called without an options hash, the existing Sereal::Encoder instance is re-used. To reset options, by instanciating a new Sereal::Encoder instance, simply pass them to {}.
$hdl->push_write(sereal => [ 1, 2, 3 ]);
# Here $hdl->{_sereal_encoder} is a Sereal::Encoder instance
$hdl->push_write(sereal => 42);
# Here $hdl->{_sereal_encoder} is still the same
$hdl->push_write(sereal => { a => 1 }, { snappy => 1 });
# Here $hdl->{_sereal_encoder} contains a *new* Sereal::Encoder instance
# with snappy option enabled
$hdl->push_write(sereal => 42);
# Here $hdl->{_sereal_encoder} is still the same, so with snappy
# option enabled
$hdl->push_write(sereal => 42, {});
# Here $hdl->{_sereal_encoder} contains a *new* Sereal::Encoder instance,
# without any option
...
The same applies for the deserializer:
Still to be fast, a Sereal::Decoder instance is stored in the _sereal_decoder
attribute of the AnyEvent::Handle instance.
Each time the deserializer receives options via push_read
or unshift_read
, a new Sereal::Decoder object is instanciated and the previous one is destroyed. When push_read
or unshift_read
are called without options, the existing Sereal::Decoder instance is re-used. To reset options, by instanciating a new Sereal::Decoder instance, simply pass them to {}.
$hdl->push_read(sereal => \&cb1);
# When cb1 is called, $hdl->{_sereal_decoder} contains a
# Sereal::Decoder instance
$hdl->push_read(sereal => \&cb2);
# When cb2 is called, $hdl->{_sereal_decoder} is still the same
$hdl->push_read(sereal => { refuse_snappy => 1 }, \&cb3);
# When cb3 is called, $hdl->{_sereal_decoder} contains a *new*
# Sereal::Decoder instance with refuse_snappy option enabled
$hdl->push_read(sereal => \&cb4);
# When cb4 is called, $hdl->{_sereal_decoder} is still the same,
# so with refuse_snappy option enabled
$hdl->push_read(sereal => {}, \&cb5);
# When cb5 is called, $hdl->{_sereal_decoder} contains a *new*
# Sereal::Decoder instance, without any option
...
Note that the Sereal::{De,En}coder instances are re-instanciated each time an options hash is passed, even if the options do not change.
SEE ALSO
AnyEvent::Handle and storable filter.
Sereal::Encoder and Sereal::Decoder.
AUTHOR
Maxime Soulé, <btik-cpan@scoubidou.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2012 by Ijenko.
http://www.ijenko.com
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.