现在,您现在的操作方式使您很难知道在读取此类对象的内容流时会发生什么。即您应该读取浮点数、整数还是字符串?
假设您可以更改输出运算符,您可以采取两种方法:
完全删除条件逻辑:
在我看来,解决这个问题的最佳方法是将输出运算符重写为:
ostream& operator<<(ostream& os, const myObject& obj)
{
os << '(' << obj.somefloat << ')'
<< '(' << obj.oneint
<< '#' << obj.twoint << ')';
return os;
}
然后,您可以将输入运算符编写为:
istream& operator>>(istream& is, myObject& obj)
{
char discard = 0;
is >> discard;
is >> obj.somefloat;
is >> discard >> discard;
is >> obj.oneint >> discard;
is >> obj.twoint >> discard;
return is;
}
(当然,您还应该在读取之间添加错误处理)
序列化条件逻辑:
您可以将对象的“格式”保存为显式参数。这基本上是大多数支持版本控制的文档序列化方案中所做的。
enum SerializationMode {
EMPTY = 0,
FLOAT,
INT_PAIR
};
然后输出运算符变为:
ostream& operator<<(ostream& os, const myObject& obj)
{
SerializationMode mode = EMPTY;
if (obj.somefloat != 0)
mode = FLOAT;
else if ( obj.oneint != 0 && obj.twoint != 0)
mode = INT_PAIR;
os << mode << '#';
if (FLOAT == mode)
os << "(" << obj.somefloat << ")";
else if (INT_PAIR == mode)
os << "(" << obj.oneint << "#" << obj.twoint << ")";
return os;
}
输入运算符:
istream& operator>>(istream& is, myObject& obj)
{
char discard = 0;
unsigned uMode = 0;
is >> uMode >> discard;
auto mode = static_cast<SerializationMode>(uMode);
switch(mode) {
default: break;
case FLOAT: {
is >> discard >> obj.somefloat >> discard;
break;
}
case INT_PAIR: {
is >> discard >> obj.oneint >> discard;
is >> obj.twoint >> discard;
break;
}
}
return is;
}