Boost binary serialization, patch proposal for cross architectures compatibility

Hi, I'm a user of boost serialization and I've detected a small lack in inter-architecture compatibility. Issue: The C and C++ programming languages have different native storage of standard type depending on the architecture of the operating system. For example: On a Linux 64bits (LP64), a long variable is stored with 8 bytes but on a Windows 32bits (ILP32) that same variable will be stored with 4 bytes. Using boost binary serialization as common format for data exchange between those different systems won't work fine. I've written a small patch to fix this issue. Change: _ Detect if binary serialized data come from a system with different native architecture by reading the header. Even if archive is created with the flag "no_header", the architecture signature is stored. _ Change the way how std::string (char*, and other) are stored. We have to store the string's length as a fixed size type (I've chosen unsigned int) and not size_t (which is an unsigned integer of 64bits on 64bits architecture and of 32bits on 32bits architecture). _ Change the way how long and unsigned long are stored by specializing template function for saving and loading. _ All those changes have been protected by a "#define BOOST_CROSS_ARCHITECTURE_COMPATIBLE" I've compiled and tested this patch, on Windows XP 32bits, Debian Linux 64bits (x86_64), compiled with Visual Studio 2005 ( 8.0) and gcc 4.1 Best regards, Steve Gury PS:You can find the patch as attachment.

Note that the native binary format has not pretentions to portability. Its designed to be the leanest and fastest version. How is this different from "portable_archive" example included in the package? Robert Ramey Steve Gury wrote:
Hi,
I'm a user of boost serialization and I've detected a small lack in inter-architecture compatibility.
Issue: The C and C++ programming languages have different native storage of standard type depending on the architecture of the operating system. For example: On a Linux 64bits (LP64), a long variable is stored with 8 bytes but on a Windows 32bits (ILP32) that same variable will be stored with 4 bytes. Using boost binary serialization as common format for data exchange between those different systems won't work fine. I've written a small patch to fix this issue.
Change: _ Detect if binary serialized data come from a system with different native architecture by reading the header. Even if archive is created with the flag "no_header", the architecture signature is stored. _ Change the way how std::string (char*, and other) are stored. We have to store the string's length as a fixed size type (I've chosen unsigned int) and not size_t (which is an unsigned integer of 64bits on 64bits architecture and of 32bits on 32bits architecture). _ Change the way how long and unsigned long are stored by specializing template function for saving and loading. _ All those changes have been protected by a "#define BOOST_CROSS_ARCHITECTURE_COMPATIBLE"
I've compiled and tested this patch, on Windows XP 32bits, Debian Linux 64bits (x86_64), compiled with Visual Studio 2005 ( 8.0) and gcc 4.1
Best regards, Steve Gury
PS:You can find the patch as attachment.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Ok Robert, it seems you have already done the work ! "portable_binary_archive" fixes effectively the problem. I haven't founded that code before writing my patch. Thanks for your response, Steve On 2/11/07, Robert Ramey <ramey@rrsd.com> wrote:
Note that the native binary format has not pretentions to portability. Its designed to be the leanest and fastest version.
How is this different from "portable_archive" example included in the package?
Robert Ramey
Steve Gury wrote:
Hi,
I'm a user of boost serialization and I've detected a small lack in inter-architecture compatibility.
Issue: The C and C++ programming languages have different native storage of standard type depending on the architecture of the operating system. For example: On a Linux 64bits (LP64), a long variable is stored with 8 bytes but on a Windows 32bits (ILP32) that same variable will be stored with 4 bytes. Using boost binary serialization as common format for data exchange between those different systems won't work fine. I've written a small patch to fix this issue.
Change: _ Detect if binary serialized data come from a system with different native architecture by reading the header. Even if archive is created with the flag "no_header", the architecture signature is stored. _ Change the way how std::string (char*, and other) are stored. We have to store the string's length as a fixed size type (I've chosen unsigned int) and not size_t (which is an unsigned integer of 64bits on 64bits architecture and of 32bits on 32bits architecture). _ Change the way how long and unsigned long are stored by specializing template function for saving and loading. _ All those changes have been protected by a "#define BOOST_CROSS_ARCHITECTURE_COMPATIBLE"
I've compiled and tested this patch, on Windows XP 32bits, Debian Linux 64bits (x86_64), compiled with Visual Studio 2005 ( 8.0) and gcc 4.1
Best regards, Steve Gury
PS:You can find the patch as attachment.
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (2)
-
Robert Ramey
-
Steve Gury