【问题标题】:Is it possible to Serialize and Deserialize objects in C++?是否可以在 C++ 中序列化和反序列化对象?
【发布时间】:2010-03-22 19:57:07
【问题描述】:

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

如果可以,如何实现?

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

那么在 c++ 中如何呢?

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

【问题讨论】:

标签: c# java c++


【解决方案1】:
【解决方案2】:

在 C++ 中没有内置功能可以执行此操作。您将不得不使用外部库,例如 Boost

【讨论】:

    【解决方案3】:

    Java 和 C# 支持reflection。基本上他们可以从对象/类中找到足够的信息来进行有意义的自动序列化/反序列化。

    C++ 语言没有reflection,例如你不能遍历一个类的字段。所以你必须使用或多或少的手动方法。当然有像Boost::serialization 这样的库可以提供帮助。

    【讨论】:

      【解决方案4】:

      您可以在不使用“new”运算符的情况下使用堆栈存储,因此该类基本上像结构一样被打包,然后将整个内存区域导出到文件中。当您再次需要它时,分配内存区域并将类数据从文件中读回其中,然后像往常一样访问它。它不会是便携式的,但它会工作。在 Nintendo DS 这样的机器上,当您使用编辑器保存内容时存储关卡数据非常好,虽然肯定不漂亮(而且在复杂系统上很危险!)

      注意:我不建议您这样做,但如前所述,它在某些嵌入式平台上有效。我只是想发布一些有趣的东西,自制开发者在使用 palib 进行开发时实际上在 Nintendo DS 上使用 C++ 进行。

      【讨论】:

      • 我不会投反对票,但掌上任天堂的编程实践不一定会延续下去。你是说一次将几个不同的对象作为一个内存球从堆栈中拉出?
      • 这是一个非常好的游戏系统——例如它提供了非常好的关卡加载时间 - 但它并不适用于很多应用程序。
      • 如果类中的任何对象都有堆栈存储,这将不起作用。这意味着现在你不能使用任何 STL 容器,不能使用 PIMPL,不能使用指针或引用。
      • 确实 :) 我想我还是会把它扔掉。顺便说一句,通过覆盖该类的 new 运算符,可以使用堆栈上的内存作为堆来分配内存。这样,仍然可以使用所有这些东西(请确认:))。
      • 这是一个几乎危险的答案...我不反对它,因为我认为它很酷,但如果有人问基本问题,也许我们应该给出基本答案?
      【解决方案5】:

      即使在 java 中,Serializable 接口也只是一种 方法。我会在这里好好考虑protocol buffers;有 java、C++ 和 C# (/.NET) 实现,and many others;除了快速、高效的二进制序列化之外,还为您提供互操作/可移植性。

      【讨论】:

        【解决方案6】:

        一般情况下,你可以写一个叫做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));
        

        您可以根据需要对类对象中的尽可能多的变量执行此类操作。 干杯。

        【讨论】:

          【解决方案7】:

          有各种库支持 C++ 的序列化,但它是一项更复杂的工作。 Java 中的序列化取决于对象形成一个单一的整体树这一事实,而 C++ 中根本不是这种情况。

          【讨论】:

            【解决方案8】:

            使用 Qt4 http://qt.nokia.com/doc/qdatastream.html 为 operator>

            提供覆盖
            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;
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-09-19
              • 1970-01-01
              • 2016-09-25
              • 1970-01-01
              • 2015-06-06
              • 2011-01-08
              相关资源
              最近更新 更多