我们知道c ++也是一种面向对象的编程语言,其中大多数东西都是像java这样的对象。所以想知道Serialize和deserializ功能是否可以在c ++中使用,我们在java中也可以使用?
如果是,如何实现?
在java中我们使用Serializable接口来说明这种类型的对象可以被序列化和反序列化。
那么在c ++中怎么样?
出于好奇,它在c#和java中一样吗?
答案 0 :(得分:5)
检查出来:
http://www.functionx.com/cpp/articles/serialization.htm
或使用
升压:序列 http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/index.html
答案 1 :(得分:2)
在C ++中没有内置功能。您必须使用外部库,例如Boost。
答案 2 :(得分:1)
您可以在不使用'new'运算符的情况下使用堆栈存储,因此该类基本上像结构一样打包,然后将整个内存区域导出到文件。如果再次需要它,请分配内存区域并从文件中读取类数据,然后像平常一样访问它。它不会便携,但它会起作用。当你使用编辑器保存某些东西时,在Nintendo DS这样的机器上存储水平数据是相当不错的,虽然肯定不漂亮(而且在复杂的系统上也是危险的!)
注意:我不建议您这样做,但它在某些嵌入式平台上有效,如上所述。我只想发布一些有趣的东西,当使用palib进行开发时,自制开发人员在Nintendo DS上用C ++实际做了。
答案 3 :(得分:1)
Java和C#支持reflection。基本上,他们可以从对象/类中找到足够的信息,以进行有意义的自动序列化/反序列化。
C ++语言没有reflection,例如,您无法通过类的字段进行迭代。所以你必须使用或多或少的手动方法。当然有像Boost::serialization这样的图书馆可以提供帮助。
答案 4 :(得分:1)
即使在java中,Serializable
接口只是一个方法。我会在这里好好考虑protocol buffers;有java,C ++和C#(/ .NET)实现,and many others;除快速,高效的二进制序列化外,还为您提供互操作性/可移植性。
答案 5 :(得分:1)
通常,您可以编写一个名为serialize()的函数,然后执行以下操作:
ofstream outFile;
outFile.open (dirFileString.c_str(), ios::binary);
outFile.write (reinterpret_cast < char *>(&x),
sizeof (x));
outFile.write (reinterpret_cast < char *>(&y),
sizeof (y));
然后有一个类似的函数来读入:
inFile.read (reinterpret_cast < char *>(&x),
sizeof (x));
inFile.read (reinterpret_cast < char *>(&y),
sizeof (y));
您可以根据需要为类对象中的多个变量执行此类操作。 欢呼声。
答案 6 :(得分:0)
有许多库可以支持C ++的序列化,但这是一个更复杂的工作。 Java中的序列化取决于对象形成单个整体树的事实,而C ++中则不然。
答案 7 :(得分:0)
使用Qt4 http://qt.nokia.com/doc/qdatastream.html 为运营商提供覆盖&lt;&lt;和运算符&gt;&gt;
template <class KT, class VT>
inline QDataStream &operator>>(QDataStream &in, SOMap<KT, VT> &map) {
QDataStream::Status oldStatus = in.status();
in.resetStatus();
map.clear();
quint32 n;
in >> n;
for (quint32 i = 0; i < n; ++i) {
if (in.status() != QDataStream::Ok)
break;
KT key;
VT value;
in >> key >> value;
map.append(key, value);
}
if (in.status() != QDataStream::Ok)
map.clear();
if (oldStatus != QDataStream::Ok)
in.setStatus(oldStatus);
return in;
}
template <class KT, class VT>
inline QDataStream &operator<<(QDataStream &out, const SOMap<KT, VT> &map) {
out << quint32(map.size());
for(int i = 0, c = map.size(); i < c; ++i) {
typename SOMap<KT, VT>::pair_type n = map.at(i);
out << n.first << n.second;
}
return out;
}