Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > storing "almost-POD" classes to binary file

Reply
Thread Tools

storing "almost-POD" classes to binary file

 
 
Jacek Dziedzic
Guest
Posts: n/a
 
      12-18-2005

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.
 
Reply With Quote
 
 
 
 
Bob Hairgrove
Guest
Posts: n/a
 
      12-18-2005
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
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
 
 
 
Michiel.Salters@tomtom.com
Guest
Posts: n/a
 
      12-19-2005

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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
User Images: Storing in Files VS Storing in Database Jonathan Wood ASP .Net 1 06-02-2008 05:56 PM
storing pointer vs storing object toton C++ 11 10-13-2006 11:08 AM
Storing/processing binary file input help needed Arnold C++ 7 01-07-2004 08:10 AM
Storing/processing binary file input help needed Arnold C Programming 9 01-07-2004 08:10 AM
Re: Storing/processing binary file input help needed Gianni Mariani C++ 0 01-06-2004 09:10 AM



Advertisments