DIP 45 - approval discussion

Jacob Carlborg doob at me.com
Wed Nov 13 02:46:28 PST 2013


On 2013-11-13 10:27, Andrei Alexandrescu wrote:

> With Object.factory that's taken care of already.

No, you need to register the subclasses as well. The static type 
information is lost for the subclasses.

> Again there is a confusion here. The idea was to create an object with
> the dynamic type Foo if the class name was "Foo" and an object with the
> dynamic type Bar if the class name was "Bar". You are glossing over the
> gist of it all with a function call. Are you sure we are talking about
> the same thing?

Here is an excerpt of my serialization library, with the relevant code 
for this discussion:

void function (in Object) [ClassInfo] registeredTypes;

void register (T : Object) ()
{
     registeredTypes[T.classinfo] = &downcastSerialize!(T)
}

void downcastDeserialize (U : Object) (in Object value)
{
     alias Unqual!(U) T;
     auto casted = cast(T) value;

     assert(casted);
     assert(casted.classinfo is T.classinfo);

     deserializeHelper(casted);
}

void deserializeHelper (T) (T value) { ... }

bool isBaseClass (T) (T value)
{
     return value.classinfo !is T.classinfo;
}

T deserialize (T) (string name)
{
     T t;

     if (auto classInfo = ClassInfo.find(name))
     {
          auto value = cast(T) _d_alloc(classInfo);

         if (isBaseClass(value))
         {
             if (auto deserializer = value.classinfo in registeredTypes)
                 (*serializer)(value);

             else
                 throw new Exception("Unregistered subclass");
         }

         else
             deserializeHelper(value);

         return value;
     }

     else
     {
         throw new Exception("The class " ~ name ~ " couldn't be found");
         return null;
     }
}

For the full code see: 
https://github.com/jacob-carlborg/orange/blob/master/orange/serialization/Serializer.d

-- 
/Jacob Carlborg


More information about the Digitalmars-d mailing list