繁体   English   中英

是否可以在C ++中序列化和反序列化对象?

[英]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这样的库可以提供帮助。

即使在java中, Serializable接口也只是一种方法。 我会在这里考虑协议缓冲区 ; 有java,C ++和C#(/ .NET)实现, 以及许多其他实现 ; 除快速,高效的二进制序列化外,还为您提供互操作性/可移植性。

通常,您可以编写一个名为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM