deserialization: creating a class instance without calling constructor

Baz via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu May 21 03:05:29 PDT 2015


On Thursday, 21 May 2015 at 09:06:59 UTC, Timothee Cour wrote:
> Can I create an instance of A without calling a constructor? 
> (see below)
> Use case: for generic deserialiaztion, when the deserialization 
> library
> encounters a class without default constructor for example (it 
> knows what
> the fields should be set to, but doesn't know how to construct 
> the object).
>
> class A{
>   int x=2;
>   this(int x){
>     this.x=x;
>   }
> }
>
>
> This came up here:
> https://github.com/msgpack/msgpack-d/issues/54#issuecomment-104136148
> I provide some hacky solution for that in that thread but I 
> suspect it's
> not safe and something is missing.

based on this:

https://github.com/D-Programming-Language/druntime/blob/6698ee21d4eb00ec2e8c621993359d235618df75/src/rt/lifetime.d#L71

you can create an instance without calling the constructor like 
this:

---
CT construct(CT, A...)(A a)
if (is(CT == class))
{
     auto memory = malloc(typeid(CT).init.length);
     memory[0 .. typeid(CT).init.length] = typeid(CT).init[];
     return cast(CT) memory;
}
---

actually it only copies the fields with their initial values.




More information about the Digitalmars-d-learn mailing list