On 2013-11-19 14:24, Atila Neves wrote:

It serialises the slice and restores it as it was, not the data behind
it. I should add some tests for that.


class Foo
{
    int[] a;
    int[] b;
}

auto foo = new Foo;
foo.a = [1, 2, 3, 4];
foo.b = foo.a[1 .. 3];

auto cereal = new Cerealiser();
cereal ~= foo;

auto decerealiser = new Decerealiser(cereal.bytes);
auto foo2 = decerealiser.value!(Foo);
foo2.b[0] = 10;
assert(foo2.a[1] == 10); // will this pass?

I'm not sure I understand the question.

auto cereal = new Cerealiser();
cereal ~= foo;
cereal ~= foo; // will this be serialized a second time or will a reference to it be serialized?

No. I can't see how that would be possible without implementing an
interface (I may well be wrong), and that was the kind of thing I really
didn't want to do. Not only that, but for the kind of code I write, I
either want to send something to the network, in which case I know which
class to instantiate and don't need a base class reference, or I want to
unmarshall bytes that came in. In the latter case there's usually an
identifier in the header to tell the factory method which class to
instantiante. So that doesn't usually come up.

Even if you know the identifier in the header file you need a static type when deserializing:

decerealiser.value!(Foo)

Even if you can instantiate the right subclass you need to have the static type information to deserialize it.

It is possible to do, as I have done in Orange. The requirement is to register the subclasses that need to be serialized through a base class reference. See https://github.com/jacob-carlborg/orange/blob/master/orange/serialization/Serializer.d#L241..L262 and https://github.com/jacob-carlborg/orange/blob/master/orange/serialization/Serializer.d#L787..L788

--
/Jacob Carlborg

Reply via email to