[英]Is it possible to Serialize and Deserialize objects in C++?
我们知道c ++也是一种面向对象的编程语言,其中大多数东西都是像java这样的对象。 所以想知道Serialize和deserializ功能是否可以在c ++中使用,我们在java中也可以使用?
如果是,如何实现?
在java中我们使用Serializable接口来说明这种类型的对象可以被序列化和反序列化。
那么在c ++中如何?
出于好奇,它在c#和java中一样吗?
在C ++中没有内置的功能。 您将不得不使用外部库,如Boost 。
您可以在不使用'new'运算符的情况下使用堆栈存储,因此该类基本上像结构一样打包,然后将整个内存区域导出到文件。 如果再次需要它,请分配内存区域并从文件中读取类数据,然后像平常一样访问它。 它不会便携,但它会起作用。 当你使用编辑器保存某些东西时,在Nintendo DS这样的机器上存储水平数据是相当不错的,虽然肯定不漂亮(而且在复杂的系统上也很危险!)
注意:我不建议您这样做,但它在某些嵌入式平台上是有效的,如上所述。 我只是想发布一些有趣的东西,当使用palib进行开发时,自制开发人员在Nintendo DS上用C ++实际做了。
Java和C#支持反射 。 基本上,他们可以从对象/类中找到足够的信息,以进行有意义的自动序列化/反序列化。
C ++语言没有反射 ,例如,您无法通过类的字段进行迭代。 所以你必须使用或多或少的手动方法。 当然有像Boost :: serialization这样的库可以提供帮助。
通常,您可以编写一个名为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));
您可以根据需要为类对象中的多个变量执行此类操作。 干杯。
有各种库来支持C ++的序列化,但它是一个更复杂的工作。 Java中的序列化取决于对象形成单个整体树的事实,而C ++中根本不是这种情况。
使用Qt4 http://qt.nokia.com/doc/qdatastream.html为操作符<<和操作符>>提供覆盖
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.