On 08/08/2010 05:46 AM, Jacob wrote:
On 8 aug 2010, at 07:47, Andrei Alexandrescu wrote:

I think that would be great. Knowing nothing about Orange, I
visited the website and read the feature lists and the tutorial
(the reference seems to be missing for now). The latter contains:

auto a2 = serializer.deserialize!(A)(data);

which seems to require compile-time knowledge of the deserialized
type. I'd expect the library to support something like

Object a2 = serializer.deserialize!Object(data);

This is currently not possible in the library.

I see. This is probably the single most important requirement of a serialization library, by a large margin. A classic example of object orientation is the Shape hierarchy and the array of Shape objects that you draw on the screen etc. Where books are usually coy (and where classic object technology took a while to get up to snuff) is the save/restore part, e.g. once you have an array of Shapes, how do you save it to disk and how do you load it back?

Saving is easy because you already know the types of objects involved so you could define a virtual function save() that is customizable per type. Loading is not that easy because you need to bootstrap object types from the input stream - and here's where the factory pattern etc. come into play.

It is absolutely necessary that a serialization library makes scenarios like the above simple and fool-proof.

I'm not sure if that
would be possible, how would you deserialize a struct for example?
There is no factory function for structs like there is for classes.

To deserialize a struct, I think it's reasonable to require that the receiver knows the struct statically. In the Thrift protocol things are more lax - you can e.g. write a struct Point containing two ints, and you could deserialize it as two ints. I think that's reasonable. The point is the stream contains primitive type information and class field information about all data trafficked.

Since all the static types of the objects would be Object how would I
set the values when deserializing?

Deserialize into Object and then cast the Object to Shape.

Or would Variant be useful here? I
have not used Variant.

Probably Variant would play a role when e.g. one wants to deserialize "the next primitive type" without needing to know exactly what type that is (e.g. different integer widths).


Andrei
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to