Let me explain with an example:
interface Container {}
class SList(T) : Container {}
-- App A --
SList!(int) x;
x.serialize();
-- App B --
Container x = deserialize();
This will only work if App B has instantiated an SList!(int) somewhere,
otherwise the TypeInfo won't exist. This particular issue is only a problem in
one part of std.concurrency: priority messages. If the user does a
receive(int), let's say, and there's a priority message waiting of type string
it will be thrown as PriorityMessageException!(string). If the priority
message is a template...
Other than that, std.concurrency will work just fine with Orange as-is because
receive() is a template so the type of the expected data is available at
compile-time.
Regarding the issue above, what I'll probably end up doing is throwing a
PriorityMessageException!(SerializedType) (where SerializedType is a lot like a
Variant) and the user can call .deserialize!(string) or whatever if he wants to
extract the data. If someone has a better suggestion for how to handle this,
I'd love to hear it.
On Aug 8, 2010, at 7:03 AM, Sean Kelly wrote:
> I agree, but templates will always be a problem.
>
> Sent from my iPhone
>
> On Aug 8, 2010, at 6:48 AM, Jacob <[email protected]> wrote:
>
>>
>> On 8 aug 2010, at 14:26, Michel Fortin wrote:
>>
>>> Le 2010-08-08 à 1:47, Andrei Alexandrescu a écrit :
>>>
>>>> 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);
>>>>
>>>> and fill the object with an A. I'm pretty certain you've done that, it
>>>> would be great to feature that within the tutorials and documentation. I'd
>>>> also expect Variant to play a role there, e.g. you deserialize something
>>>> and you get a Variant.
>>>
>>> My own unreleased, unfinished and in-need-of-a-refactoring serialization
>>> module does that... but unfortunately dynamically recreating the right type
>>> cannot be so straightforward in the current state of runtime reflection.
>>>
>>> This post turned out longer that I expected, please stay with me.
>>>
>>> Runtime reflection currently gives you access *only* to the default
>>> constructor, so this is what my module do internally when unserializing a
>>> class:
>>>
>>> ClassInfo c = findClass(classNameFromSerializationStream);
>>> Object o = c.create();
>>> (cast(Unserializable)o).unserialize(serialiationStream);
>>>
>>> Since we can't access a constructor with a different signature, we can't
>>> unserialize directly from the constructor. This is rather a weak point as
>>> it forces all objects to have a default constructor. Another options is for
>>> the user to manually register his own constructor with the serialization
>>> system prior unserializing, but that's much less convenient.
>>
>> Currently I don't call the constructor, just creating an instance of the
>> class and sets its fields. I don't know how good or bad that actually is.
>> Another option would be to use the __ctor and call one of the constructors
>> (if it has multiple constructors) with the default values for the signature.
>>
>>> The unserialize member function called above must be explicitly added by
>>> the user (either manually or with a mixin) because the fields don't reflect
>>> at runtime and the actual class is unknown at compile-time. And the class
>>> needs to conform to an interface that contains that unserialize function so
>>> we can find it at runtime.
>>
>> I think that is too much extra work. One of my goals was to be able to
>> serialize third party types.
>>
>>> So before adding a serialization library, I would suggest we solve the
>>> runtime-reflection problem and find a standard way to attach various
>>> attributes to types and members. That could be done as a library, but
>>> ideally it'd have some help from the compiler which could put this stuff
>>> where it really belongs: ClassInfo. Currently, QtD has its own mixins for
>>> that, my D/Objective-C bridge has its own mixins and class registration
>>> system, my serialization module has its own, surely Orange has its own, I
>>> believe PyD has its own... this is going to be a mess pretty soon if it
>>> isn't already.
>>>
>>> Once we have a proper standardized runtime-reflection and attribute system,
>>> then the serialization module can focus on serialization instead of
>>> implementing various hacks to add and get to the information it needs.
>>
>> That is absolutely the best solution. I tried to do the best I could with
>> the current compiler/runtime.
>>
>>> --
>>> Michel Fortin
>>> [email protected]
>>> http://michelf.com/
>>>
>>>
>>>
>>> _______________________________________________
>>> phobos mailing list
>>> [email protected]
>>> http://lists.puremagic.com/mailman/listinfo/phobos
>>
>> _______________________________________________
>> phobos mailing list
>> [email protected]
>> http://lists.puremagic.com/mailman/listinfo/phobos
> _______________________________________________
> phobos mailing list
> [email protected]
> http://lists.puremagic.com/mailman/listinfo/phobos
_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos