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

时间:2010-03-21 19:08:00

标签: c# java c++

我们知道c ++也是一种面向对象的编程语言,其中大多数东西都是像java这样的对象。所以想知道Serialize和deserializ功能是否可以在c ++中使用,我们在java中也可以使用?

如果是,如何实现?

在java中我们使用Serializable接口来说明这种类型的对象可以被序列化和反序列化。

那么在c ++中怎么样?

出于好奇,它在c#和java中一样吗?

8 个答案:

答案 0 :(得分:5)

答案 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;
}