By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,190 Members | 839 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,190 IT Pros & Developers. It's quick & easy.

storing "almost-POD" classes to binary file

P: n/a

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-gro...x/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.
Dec 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On Sun, 18 Dec 2005 18:49:17 +0100, Jacek Dziedzic
<jacek@no_spam.tygrys.no_spam.net> wrote:

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-gro...x/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.

--
Bob Hairgrove
No**********@Home.com
Dec 18 '05 #2

P: n/a

Jacek Dziedzic wrote:
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

Dec 19 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.