What it the preferred method to write a class to a file?

Charles D Hixson charleshixsn at earthlink.net
Sun Jul 23 12:18:40 PDT 2006


Stewart Gordon wrote:
> Charles D Hixson wrote:
>> I'm thinking that I should build two methods, possibly
>> called write and print where write would export a "binary"
>> version of the class that is not intended to be human
>> readable and print would export something with, e.g.,
>> numbers translated into strings.
>>
>> It appears as if the methods should be instance methods of
>> the class.  It looks as if write should be implemented
>> something like:
>> void write(Stream stream)
>> {  stream.writeExact(&this, this.sizeof);    }
> 
> That won't work at all.  Because classes have reference semantics, all
> it'll do is write out the memory address of the object.
> 
> Even so, the arrangement of members within a class isn't guaranteed:
> 
> http://www.digitalmars.com/d/class.html
> "The D compiler is free to rearrange the order of fields in a class to
> optimally pack them in an implementation-defined manner. Consider the
> fields much like the local variables in a function - the compiler
> assigns some to registers and shuffles others around all to get the
> optimal stack frame layout. This frees the code designer to organize the
> fields in a manner that makes the code more readable rather than being
> forced to organize it according to machine optimization rules. Explicit
> control of field layout is provided by struct/union types, not classes."
> 
> Moreover, every object includes a pointer to the vtable, which will
> screw things up when the program is run again and the data is read back
> in.  Add to that any pointers, dynamic arrays or object references that
> your class may contain....
> 
>> Though probably in this version I'd want to include
>> delimiters, a type id, and a length to facilitate writing
>> the corresponding read routing (which would need to be a
>> class method).
> 
> You need to define a data format that includes all the information that
> is needed in order to reconstruct the object.  Start with a type ID of
> your own devising (if there's any chance that more than one type fits
> the context), and write out each member.  For primitive types, static
> arrays and structs that have no reference-semantics members, this is
> trivial.  For dynamic arrays, write out the length followed by the
> contents.  For object references within the class, follow this principle
> recursively.  Be careful of any potential circularity.
> 
>> It this the best approach?   Also are there any suggestions
>> as to a reasonable way to specify the type id, so that it
>> would be the same from run to run? 
> 
> Only the one you suggest next:
> 
>> Should I keep track of the ids myself (manually)?
> <snip>
> 
> Yes.
> 
> Stewart.
> 
Thanks. (Sigh...I guess this is all tied in with introspection.)



More information about the Digitalmars-d-learn mailing list