我使用boost序列化和反序列化某些类
像这样:
boost::archive::xml_oarchive xmlArchive(oStringStream);
xmlArchive.register_type(static_cast<BaseMessage *>(NULL));
xmlArchive.register_type(static_cast<IncomingTradeMessage *>(NULL));
xmlArchive.register_type(static_cast<InternalRequestInfo *>(NULL));
xmlArchive.register_type(static_cast<InternalTradeTransInfo *>(NULL));
const BaseMessage* myMessage =message;
xmlArchive << make_nvp("Message", myMessage);
现在我的clasess根据使用的顺序得到一个class_id,我不想要那个,我想控制Class_id的
所以我可以做点什么
BOOST_SET_CLASS_ID(1234, BaseMessage);
在我的项目BaseMessage的任何地方都会有class_id为1234。
我怎么能做这样的事情
答案 0 :(得分:4)
您不能使用BOOST_CLASS_EXPORT_GUID
或类似名称吗?即。
BOOST_CLASS_EXPORT_GUID(IncomingTradeMessage, "IncomingTradeMessage")
...
它将使用更多带宽,因为传输字符串而不是整数,但它将解决您的问题。
修改强>
编译得很好:
#include <fstream>
#include <boost/serialization/export.hpp>
#include <boost/archive/text_oarchive.hpp>
class Foo {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & dummy1;
}
int dummy1;
public:
virtual ~Foo() {}
};
class Bar : public Foo {
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
// serialize base class information
ar & boost::serialization::base_object<Foo>(*this);
ar & dummy2;
}
int dummy2;
};
BOOST_CLASS_EXPORT_GUID(Foo, "Foo")
BOOST_CLASS_EXPORT_GUID(Bar, "Bar")
int main(int argc, char *argv[]) {
std::ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);
Foo *f = new Bar;
oa << f;
return 0;
}
答案 1 :(得分:1)
我不确定这是否适用于您的情况(如果您的问题是专门寻求提升或不提供机制),但字符串怎么样?我知道没有这样的增强工具,但我已经将这种解决方案应用于我们的代码库:
#include <iostream>
#include <string>
using namespace std;
template <class T>
const char* my_type_id()
{
return "Unknown";
}
#define REGISTER_TYPE(some_type) \
template <> inline \
const char* my_type_id<some_type>() \
{ \
return #some_type; \
}
REGISTER_TYPE(int)
REGISTER_TYPE(std::string)
int main()
{
// displays "int"
cout << my_type_id<int>() << endl;
// displays "std::string"
cout << my_type_id<string>() << endl;
// displays "Unknown" - we haven't registered char
cout << my_type_id<char>() << endl;
}
它基本上是在重新发明RTTI,如果你可以用于生产版本,那就不需要上面的解决方案了。我们不能像软件开发套件那样做,我们不想假设每个人都使用RTTI。
如果你需要整数而不是字符串,那么很容易适应这个:
template <class T>
int my_type_id()
{
return -1;
}
#define REGISTER_TYPE(some_type, type_code) \
template <> inline \
int my_type_id<some_type>() \
{ \
return type_code; \
}
REGISTER_TYPE(int, 1234)
REGISTER_TYPE(std::string, 4567)
您甚至可以避免函数调用的开销,只需生成一个类,将这些与类型相关的整数值存储为枚举常量(保证为rvalue)。