Boost logo

Boost :

From: Jon Kroll (jkroll_at_[hidden])
Date: 2008-07-10 09:04:55


Hello:

I am attempting to use the boost serialization portable-binary archive.

The 2 architectures I am working on are:
1. Intel on MS-Windows/Mac OS X
2. PowerPC on Mac OS X

The attached sample code shows that an integer I serialize on PPC and then
  unserialize on Intel is not byte-swapped. And similarly, an integer I
  serialize on Intel is not byte-swapped on PPC.

It does not appear to be a OS issue, because the data is unserialized
  properly from a MS-Windows Intel system to a Mac OS X Intel system,
  and vise versa.

Another manifestation of this occurs when I serialize a large container,
  like a vector for example. The code has an exception because the
  size of the container is not byte-swapper. I can provide example code
  for this as well.

This experience leads me to believe either:
1. The portable binary is not functioning properly with Mac OS X PPC
or
2. I am not using the portable-binary archive properly, either configuration
    or code.

Advise on this issue would be greatly appreciated.

Best regards, Jon Kroll
Ann Arbor Michigan

=========================================================================
BUILD:
Windows: MS-Visual Studio 2005
Mac OS X:
g++ test_portable_binary.cpp portable_binary_iarchive.cpp
portable_binary_oarchive.cpp -o test_portable_binary
-I/Volumes/..../boost_1_35_0/
-L/Volumes/..../boost_1_35_0/stage/lib/
-lboost_serialization-mt-1_35

CODE:
========================================================

#include "boost/archive/portable_binary_oarchive.hpp"
#include "boost/archive/portable_binary_iarchive.hpp"

#include <vector>
#include <sstream>
#include <fstream>
#include <iostream>
#include <string>

namespace
{
bool isIntelArch()
{
    char endianTest[2] = { 1, 0 };
    return (*(short *) endianTest == 1);
}
bool isPPCArch()
{
    return !isIntelArch();
}
}

int main(int argc, char* argv[])
{
    if (false) // generate test file
    {
       std::string fileName;
       if (isPPCArch())
          fileName = "PPC_portableBinaryLargeInt.ser";
       else if (isIntelArch())
          fileName = "Intel_portableBinaryLargeInt.ser";

       int val = 16000; // 0x3E80

       std::ofstream os(fileName.c_str(), std::ios::binary);
       portable_binary_oarchive oa(os);
       oa & val;

       return 0;
    }

    int unserializedVal = 0;
    {
       std::string fileName;
       if (isPPCArch())
          fileName = "Intel_portableBinaryLargeInt.ser";
       else if (isIntelArch())
          fileName = "PPC_portableBinaryLargeInt.ser";

       std::ifstream is(fileName.c_str(), std::ios::binary);
       portable_binary_iarchive ia(is);

       ia & unserializedVal;
    }

    if (0x3E80 == unserializedVal)
    {
       return 0; // This is the correct result!
    }
    if (0x803E == unserializedVal)
    {
       return -1; // This is an error, the value is not byte-swapped
    }
    if (0 == unserializedVal)
    {
       return -1; // This is an error, nothing got unserialized
    }
    return 0;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk