… | |
… | |
157 | While it is possible to use an isa test, directly comparing stash pointers |
157 | While it is possible to use an isa test, directly comparing stash pointers |
158 | is faster and guaranteed to work. |
158 | is faster and guaranteed to work. |
159 | |
159 | |
160 | For historical reasons, the C<Types::Serialiser::Boolean> stash is |
160 | For historical reasons, the C<Types::Serialiser::Boolean> stash is |
161 | just an alias for C<JSON::PP::Boolean>. When printed, the classname |
161 | just an alias for C<JSON::PP::Boolean>. When printed, the classname |
162 | withh usually be C<JSON::PP::Boolean>, but isa tests and stash pointer |
162 | with usually be C<JSON::PP::Boolean>, but isa tests and stash pointer |
163 | comparison will normally work correctly (i.e. Types::Serialiser::true ISA |
163 | comparison will normally work correctly (i.e. Types::Serialiser::true ISA |
164 | JSON::PP::Boolean, but also ISA Types::Serialiser::Boolean). |
164 | JSON::PP::Boolean, but also ISA Types::Serialiser::Boolean). |
165 | |
165 | |
166 | =head1 A GENERIC OBJECT SERIALIATION PROTOCOL |
166 | =head1 A GENERIC OBJECT SERIALIATION PROTOCOL |
167 | |
167 | |
… | |
… | |
177 | When the encoder encounters an object that it cannot otherwise encode (for |
177 | When the encoder encounters an object that it cannot otherwise encode (for |
178 | example, L<CBOR::XS> can encode a few special types itself, and will first |
178 | example, L<CBOR::XS> can encode a few special types itself, and will first |
179 | attempt to use the special C<TO_CBOR> serialisation protocol), it will |
179 | attempt to use the special C<TO_CBOR> serialisation protocol), it will |
180 | look up the C<FREEZE> method on the object. |
180 | look up the C<FREEZE> method on the object. |
181 | |
181 | |
182 | If it exists, it will call it with two arguments: the object to |
182 | If it exists, it will call it with two arguments: the object to serialise, |
183 | serialise, and a constant string that indicates the name of the |
183 | and a constant string that indicates the name of the data model or data |
184 | serialisationformat. For example L<CBOR::XS> uses C<CBOR>, and L<JSON> and |
184 | format. For example L<CBOR::XS> uses C<CBOR>, and L<JSON> and L<JSON::XS> |
185 | L<JSON::XS> (or any other JSON serialiser), would use C<JSON> as second |
185 | (or any other JSON serialiser), would use C<JSON> as second argument. |
186 | argument. |
|
|
187 | |
186 | |
188 | The C<FREEZE> method can then return zero or more values to identify the |
187 | The C<FREEZE> method can then return zero or more values to identify the |
189 | object instance. The serialiser is then supposed to encode the class name |
188 | object instance. The serialiser is then supposed to encode the class name |
190 | and all of these return values (which must be encodable in the format) |
189 | and all of these return values (which must be encodable in the format) |
191 | using the relevant form for perl objects. In CBOR for example, there is a |
190 | using the relevant form for perl objects. In CBOR for example, there is a |
… | |
… | |
193 | |
192 | |
194 | The values that C<FREEZE> returns must be serialisable with the serialiser |
193 | The values that C<FREEZE> returns must be serialisable with the serialiser |
195 | that calls it. Therefore, it is recommended to use simple types such as |
194 | that calls it. Therefore, it is recommended to use simple types such as |
196 | strings and numbers, and maybe array references and hashes (basically, the |
195 | strings and numbers, and maybe array references and hashes (basically, the |
197 | JSON data model). You can always use a more complex format for a specific |
196 | JSON data model). You can always use a more complex format for a specific |
198 | serialiser by checking the second argument. |
197 | data model by checking the second argument. |
199 | |
198 | |
200 | =head2 DECODING |
199 | =head2 DECODING |
201 | |
200 | |
202 | When the decoder then encounters such an encoded perl object, it should |
201 | When the decoder then encounters such an encoded perl object, it should |
203 | look up the C<THAW> method on the stored classname, and invoke it with the |
202 | look up the C<THAW> method on the stored classname, and invoke it with the |
204 | classname, the constant string to identify the format, and all the return |
203 | classname, the constant string to identify the data model/data format, and |
205 | values returned by C<FREEZE>. |
204 | all the return values returned by C<FREEZE>. |
206 | |
205 | |
207 | =head2 EXAMPLES |
206 | =head2 EXAMPLES |
208 | |
207 | |
209 | See the C<OBJECT SERIALISATION> section in the L<CBOR::XS> manpage for |
208 | See the C<OBJECT SERIALISATION> section in the L<CBOR::XS> manpage for |
210 | more details, an example implementation, and code examples. |
209 | more details, an example implementation, and code examples. |
211 | |
210 | |
212 | Here is an example C<FREEZE>/C<THAW> method pair: |
211 | Here is an example C<FREEZE>/C<THAW> method pair: |
213 | |
212 | |
214 | sub My::Object::FREEZE { |
213 | sub My::Object::FREEZE { |
215 | my ($self, $serialiser) = @_; |
214 | my ($self, $model) = @_; |
216 | |
215 | |
217 | ($self->{type}, $self->{id}, $self->{variant}) |
216 | ($self->{type}, $self->{id}, $self->{variant}) |
218 | } |
217 | } |
219 | |
218 | |
220 | sub My::Object::THAW { |
219 | sub My::Object::THAW { |
221 | my ($class, $serialiser, $type, $id, $variant) = @_; |
220 | my ($class, $model, $type, $id, $variant) = @_; |
222 | |
221 | |
223 | $class->new (type => $type, id => $id, variant => $variant) |
222 | $class->new (type => $type, id => $id, variant => $variant) |
224 | } |
223 | } |
225 | |
224 | |
226 | =head1 BUGS |
225 | =head1 BUGS |