Ёпть так надо было сразу с этого начинать...
Я бы так делал:
Мы уже имеем объекты:
представим что у нас в объекте есть массив так называемых Value,Value имеет 2 переменые 1) int,индификатор типа данных которые содержатся в Value и данные void*,

struct Value
{
enum{
INT=1,
FLOAT,
BOOL,
STRING
};
char type;
void* data;
void setInt(int v)
{
type = INT;
data = &v;
}
void setFloat(flaot v)
{
type = FLOAT;
data = &v;
}
void setBool(bool v)
{
type = BOOL;
data= &v;
}
void setString(char* str)
{
type = STRING;
data=str;
}
int toInt()
{
return *static_cast<int*>(data);
}
float toFloat()
{
return *static_cast<float*>(data);
}
bool toBool()
{
return *static_cast<bool*>(data);
}
char* toString()
{
return static_cast<char*>(data);
}
bool isINT()
{
return type == INT;
}
bool isFLOAT()
{
return type == FLOAT;
}
bool isBOOL()
{
return type == BOOL;
}
bool isSTRING()
{
return type == INT;
}
};
struct Object
{
char id; // индификатор 0-225
std::vector<Value> values;
};
пишем в файл кол-во объжектов
for(int i=0;i<count_objects;i++)
{
Object* obj = objects[i];
пишем в файл char - obj->id;
пишем в файл int - obj->values.size(); - кол-во value'ев
for(int k=0;k<obj->values.size();k++)
{
Value val = obj->values[k];
пишем char val->type; - тип value
switch(val->type)
{
case Value::INT:
{
пишем int - val->getInt();
}break;
case Value::FLOAT:
{
пишем float - val->getFloat();
}break;
case Value::BOOL:
{
пишем bool - val->getBool();
}break;
case Value::STRING:
{
пишем char* - val->getString();
}break;
}
}
}
Загрузка аналагично записи.
Еесли будет не понятно могу и пример загрузки этого чуда написать..