diff --git a/lib/modules/Serializer.pmod/module.pmod b/lib/modules/Serializer.pmod/module.pmod index 91877988327fe69a00a642a9c0303d2ba67b7cff..798f799019f0a0f25a66c19ace8cb987ca0f937e 100644 --- a/lib/modules/Serializer.pmod/module.pmod +++ b/lib/modules/Serializer.pmod/module.pmod @@ -12,3 +12,62 @@ constant Serializable = Builtin.Serializable; constant serialize = Builtin.serialize; constant deserialize = Builtin.deserialize; + + +//! Simple base for an object that can be serialized by encode_value. +//! Also supports decoding. +//! +//! Uses @[Serializable] as it's base. +//! +//! Simply inherit this class in the classes you want to have encoded +//! and decoded. +//! +//! Note that it's not automatically recursive, objects assigned to +//! variables in this object have to be Encodeable on their own for +//! encode to work. +//! +//! When decoding only variables that existed at the time the object +//! was encoded are assigned, that is, if the class now has more +//! variables they new variables will be set to 0. +class Encodeable +{ + inherit Serializable; + + //! Callback for encoding the object. Returns a mapping from + //! variable name to value. + //! + //! Called automatically by @[encode_value], not normally called + //! manually. + mapping(string:mixed) _encode() + { + mapping res = ([]);; + _serialize( this, lambda( mixed val, string name, mixed type ) + { + res[name] = val; + }); + return res; + } + + // Override the one from Serializable. + void _deserialize_variable(function deserializer, + function(mixed:void) setter, + string symbol, + mixed symbol_type) + { + deserializer(setter,symbol,symbol_type); + } + + //! Callback for decoding the object. Sets variables in the object + //! from the values in the mapping. + //! + //! Called automatically by @[decode_value], not normally called + //! manually. + void _decode(mapping(string:mixed) m) + { + _deserialize( this, lambda( function(mixed:void) set, + string name, mixed type ) + { + set( m[name] ); + } ); + } +}