【发布时间】:2016-12-18 22:30:02
【问题描述】:
首先让我说我不能使用 boost,因为这应该是练习。或者是惩罚。现在不太确定。
我必须编写一个看起来像这样的函数:
template <class T1, class T2>
void serialize<T1, T2>(std::map<T1, T2> in, std::vector<uint8_t>* buf);
然后我会遍历地图,序列化每个条目中的每一对元素。但是,我遇到了一个问题。
我现在遇到的问题是,T1 可能是一个 std::vector,其中填充了其他 std::vector。我有另一个看起来类似于上面的函数,并假设它可以正常工作,如下所示:
template <class T1>
void serialize<T1>(std::vector<T1> in, std::vector<uint8_t>* buf);
这会与上面的函数有相同的问题。我应该放弃这个并采用不同的方法吗?或者这仍然可行吗?我只是错过了什么吗?
【问题讨论】:
-
你考虑过反序列化吗?给定输入缓冲区,你怎么知道那里序列化了什么?
-
这实际上既不是这里也不是那里,但我想只是在读取开始的缓冲区中有一个标志......比如 1、2、3、4 等。
-
它是这里。序列化很简单:编译器知道您正在序列化的类型,不需要 RTTI(除非您决定“隐藏”它们并序列化虚拟基类)。但是,您计划洒入的那些旗帜?...那些是 RTTI 性质的!由于它们是 Runtime 类型信息,因此模板不会像您想象的那样帮助您。在做出决定之前,请认真考虑一下您在这两个方面的需求细节。
-
我不太明白你的意思。我原本打算只有一个序列化方法。我也对这里的斜体字的含义感到困惑。
-
Google“编译时多态性”(又名“模板和模板专业化”)——Java 内置了运行时类型信息,C++ 在这方面是纳粹分子。在 Java 中,您可以拥有
Map<Object,...>并在同一个映射中拥有一个ArrayList作为键和另一个String键。在 C++ 中,map<T1, ...>将只接受T1-s 作为键(也可以在谷歌“对象切片”...作为键?”)
标签: c++ serialization stl