Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
May 21, 2015 deserialization: creating a class instance without calling constructor | ||||
---|---|---|---|---|
| ||||
Attachments:
| 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. |
May 21, 2015 Re: deserialization: creating a class instance without calling constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timothee Cour | 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.
For a start I'm pretty sure you want to be calling core.memory.GC.malloc not core.stdc.stdlib.malloc, otherwise you leak the memory.
|
May 21, 2015 Re: deserialization: creating a class instance without calling constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timothee Cour | 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. |
May 21, 2015 Re: deserialization: creating a class instance without calling constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Timothee Cour | On 2015-05-21 11:06, Timothee Cour via Digitalmars-d-learn 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. Here's how I do it in my serialization library Orange [1] [1] https://github.com/jacob-carlborg/orange/blob/master/orange/util/Reflection.d#L166 -- /Jacob Carlborg |
May 25, 2015 Re: deserialization: creating a class instance without calling constructor | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jacob Carlborg | On Thursday, 21 May 2015 at 19:06:35 UTC, Jacob Carlborg wrote:
> On 2015-05-21 11:06, Timothee Cour via Digitalmars-d-learn 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.
>
> Here's how I do it in my serialization library Orange [1]
>
> [1] https://github.com/jacob-carlborg/orange/blob/master/orange/util/Reflection.d#L166
Thanks!
|
Copyright © 1999-2021 by the D Language Foundation