On Tue, May 26, 2009 at 12:19 PM, Denis Koroskin <2kor...@gmail.com> wrote: > On Tue, 26 May 2009 21:44:49 +0400, Bill Baxter <wbax...@gmail.com> wrote: > >> On Tue, May 26, 2009 at 2:35 AM, Denis Koroskin <2kor...@gmail.com> >> wrote: >>> On Tue, 26 May 2009 13:29:39 +0400, Qian Xu >>> <quian...@stud.tu-ilmenau.de> >>> wrote: >>> >>>> BCS wrote: >>>> >>>>> I'm planning on taking a crack at a Serialization template library and >>>>> I'm >>>>> looking for feed back. My thinking so far is up on my blog here: >>>>> >>>>> >>>> >>>> http://arrayboundserror.blogspot.com/2009/05/serialization-for-d-part-1-of-n.html >>>>> >>>>> Please comment! (here or there, doesn't matter, I think I'll see both) >>>> >>>> A question: >>>> Should every object contain "mixin Serializable!()" in its declaration? >>>> It is easy to add this in own classes, but not easy to 3rd-party >>>> libraries. >>>> for instance: tango >>>> >>>> >>>> --Qian >>>> >>> >>> Good serialization library supports external serialization via template >>> specialization (or similar tricks) :) >> >> I'll also add that you should be able to properly >> serialize/deserialize a BaseClass pointer that actually points to a >> DerivedClass. >> This is pretty tricky to get working seamlessly when combined with the >> external serialization requirement. >> H3r3tic's xpose library has this working IIRC. >> >> --bb > > Sure! How about the following test: > > struct A > { > mixin Serializable!(); > > B[] b; > } > > struct B > { > mixin Serializable!(); > > A a; > int i; > } > > B[] b = new B[1]; > b[0].a.b = b; > b[0].i = 42; > > A* a = &b[0].a; > > data = serialize(a); // should serialize outer struct (B), too, because it is > accessible through a > > a = deserialize(data); > assert(a.b.length == 1); > assert(a.b[0].i == 42); > > BTW, thanks for reminding about xpose. I gotta compare it, doost.serialize > and mine own one against each other in terms of efficiency and size (for > binary output) someday.
That's not quite what I meant. I mean this: /// 3RD PARTY LIB class BaseClass { string toString() { return "base"; } } class DerivedClass { string toString() { return "derived"; } } /// MY CODE [...some kind of class registration here....] BaseClass b = new DerivedClass; data = serialize(b); b2 = deserialize(data); assert(b2.toString() == "derived"); ------------------ The data stream should contain enough info about the instance to reconstruct the exact derived type. --bb