storing "almost-POD" classes to binary file

J

Jacek Dziedzic

Hello!

Suppose I have a class that contains only public members
of builtin types and a default constructor. Because of the
default constructor it is no longer an aggregate and therefore
no longer POD, according to my understanding of

http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

I need to be able to serialize this class to/from a binary file
and read() and write() look like the easiest way. But if I
understand correctly, this is *not* guaranteed to work because
the class is non-POD, right?

Arrays of this class (let's call it 'data') need to be
stored/restored to/from a binary file in a templated class
datafile<data>. The class 'datafile' is a part of a library,
while 'data' is supplied by the library user who wants to store
arrays of 'data' into the file represented by 'datafile<data>'.

How would you go around this? I could remove the default
ctor and add a public init() method, which would make it POD,
but what happens if the user tries her 'data' class that
contains non-POD members, therefore making it non-POD.

Perhaps I should require that the data class supplies
some methods like serialize_to_bytes() and restore_from_bytes()?
That would be easy for the library, but annoying for users
who would then instead of simple

class data {
public:
int myint;
double mydouble;
long int mylong;
};

have to use

class data {
public:
int myint;
double mydouble;
long int mylong;

void serialize_to_bytes(...) {
// ... quite a few lines of code
}

void restore_from_bytes(...) {
// ... quite a few lines of code
}
};

Or perhaps storing/reading classes like that is safe even
though they contain members that are not strictly POD because
they have constructors? I am assuming no members contain
static data, there are also no pointers or pointers-to-members
involved.

TIA,
- J.
 
B

Bob Hairgrove

Hello!

Suppose I have a class that contains only public members
of builtin types and a default constructor. Because of the
default constructor it is no longer an aggregate and therefore
no longer POD, according to my understanding of

http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

I need to be able to serialize this class to/from a binary file
and read() and write() look like the easiest way. But if I
understand correctly, this is *not* guaranteed to work because
the class is non-POD, right?

Arrays of this class (let's call it 'data') need to be
stored/restored to/from a binary file in a templated class
datafile<data>. The class 'datafile' is a part of a library,
while 'data' is supplied by the library user who wants to store
arrays of 'data' into the file represented by 'datafile<data>'.

How would you go around this? I could remove the default
ctor and add a public init() method, which would make it POD,
but what happens if the user tries her 'data' class that
contains non-POD members, therefore making it non-POD.

Perhaps I should require that the data class supplies
some methods like serialize_to_bytes() and restore_from_bytes()?
That would be easy for the library, but annoying for users
who would then instead of simple

class data {
public:
int myint;
double mydouble;
long int mylong;
};

have to use

class data {
public:
int myint;
double mydouble;
long int mylong;

void serialize_to_bytes(...) {
// ... quite a few lines of code
}

void restore_from_bytes(...) {
// ... quite a few lines of code
}
};

Or perhaps storing/reading classes like that is safe even
though they contain members that are not strictly POD because
they have constructors? I am assuming no members contain
static data, there are also no pointers or pointers-to-members
involved.

TIA,
- J.

I think the only workable idea is the one requiring users to implement
or overload the serialization functions themselves. Even for POD
structs, there might be byte padding and/or alignment issues, and the
default case where there is no padding is trivial enough to implement
that it isn't really worth putting into a library.
 
M

Michiel.Salters

Jacek said:
Hello!

Suppose I have a class that contains only public members
of builtin types and a default constructor. Because of the
default constructor it is no longer an aggregate and therefore
no longer POD.

Yep. OTOH, if you put all the data members in a base class, that
base class will be a POD. You can serialize that class. Deserializing
is a bit trickier. You can deserialize a temporary and then copy it C++
style over the base object (or write another ctor that takes a base
const&)

HTH,
Michiel Salters
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,009
Latest member
GidgetGamb

Latest Threads

Top