- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
此问题与列为重复的问题不同: Boost c++ serializing a char *我没有使用 shared_ptr,而且我可以完全访问我的类的内部结构。
我能找到的最接近的回复是 Store a vector of pointers to custom objects to file这是我通过搜索编译器错误找到的。
然而,那里给出的答案并不清楚,至少对我来说是这样。它指向 boost 文档,这表明我在此处列出的简单代码应该可以工作。在对通过指针序列化对象的所有内务处理进行分类后,boost 文档这样说。
This serialization library addresses all of the above considerations.
如果我必须一次写一个 char[] 一个字符,或者如果我必须取消引用容器中的所有指针对象并将它们分解为它们的构成 POD 部分,首先将它们的大小(以字节为单位)写入流,以便用boost序列化,那么使用boost似乎没有多大意义。这是大部分工作。创建文本输出流并将字节注入(inject)其中是微不足道的。
我并不是说我对文档的阅读理解有问题,但根据我对所读内容的理解,下面的代码片段应该有效。但是,此代码会发出以下编译器错误。所以,我一定遗漏了一些东西,但我看不到它,所以这就是我寻求帮助的原因。
简单地指出下面代码片段中的失败点怎么样?或者,更好的是,提供一个有效的代码段?
/usr/include/boost/serialization/access.hpp:118:9: error: ‘class boost::ptr_vector<std::basic_string<char> >’ has no member named ‘serialize’
t.serialize(ar, file_version);
^
#include <fstream>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
class A {
public:
A(){}
char c;
char *name;
friend boost::serialization::access;
template<class Archive>
void serialize(Archive& ar, unsigned version)
{
ar & name;
}
};
main()
{
A a;
a.name = (char *)"this is a test";
std::ofstream ofs("table.txt");
boost::archive::text_oarchive os(ofs);
os << a;
}
我可以序列化 int、char,甚至是 STL 类型,但我不能用指针序列化任何东西。比如我可以序列化std::vector<std::string>
, 但如果我尝试序列化 std::vector<std::string *>
,我会得到编译器错误。
最佳答案
If I must write a char[] one character at a time, or if I must dereference all pointer objects in a container and break them down to their constituent POD parts, writing their sizes in bytes to the stream first, in order to serialize with boost, then there doesn't seem to be much point in using boost.
是的。但是您正在尝试序列化一个指针。指向 char
的指针应该被序列化为什么? T*
肯定应该序列化动态分配的 T
,不是吗?所以你会期望序列化单个 char
除非 name
是 nullptr
?
或者您是否希望对每个序列化的字符进行完整的对象跟踪?
这里的重点是您选择了原始类型的原始指针。指针缺少必要的信息。因此,您有责任添加信息。如果您觉得这乏味,您可以改用 C++ 类型。
请注意,无论如何,这在 C++03 及更高版本中是不合法的:
a.name = (char *)"this is a test";
从 char const(&)[15]
到 char *
的静态转换会删除 const 限定。无论如何,您的编译器应该拒绝此代码。
这是我的看法(使用 std::string
):
#include <boost/serialization/string.hpp>
#include <boost/archive/text_oarchive.hpp>
class A {
public:
std::string name;
template <class Archive> void serialize(Archive &ar, unsigned) {
ar & name;
}
};
int main() {
A a { "this is a test" };
boost::archive::text_oarchive os(std::cout);
os << a;
}
顺便说一句,链接的重复问题的标题与您在此处尝试执行的操作完全匹配: Boost c++ serializing a char * 并且接受的答案显示完全相同的解决方案。
如果你真的坚持,你当然可以为了没有荣耀而去玩一些 C 风格的代码:
#include <boost/serialization/serialization.hpp>
#include <boost/serialization/binary_object.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <cstring>
#include <cstdlib>
class A {
public:
A(char const* sz = nullptr) : name(sz? strdup(sz) : nullptr) {}
A(A const&) = delete;
A& operator=(A const&) = delete;
~A() { free(name); }
private:
char* name;
template <class Archive> void save(Archive &ar, unsigned) const {
bool have_name = name;
ar & have_name;
if (have_name)
{
size_t len = strlen(name);
ar & len;
ar & boost::serialization::make_binary_object(name, len);
}
}
template <class Archive> void load(Archive &ar, unsigned) {
bool have_name = name;
ar & have_name;
if (!have_name)
{
free(name);
name = nullptr;
} else
{
size_t len = 0;
ar & len;
name = static_cast<char*>(realloc(name, len));
ar & boost::serialization::make_binary_object(name, len);
}
}
friend class boost::serialization::access;
BOOST_SERIALIZATION_SPLIT_MEMBER()
};
int main() {
A a { "this is a test" };
boost::archive::text_oarchive os(std::cout);
os << a;
}
但是,所有这一切让您获得了 6 倍的代码、残缺的值语义、完全放弃的关注点分离、大量潜在的错误(您是否考虑过 name==null
和strlen(name)==0
? Currently my implementation employs unspecified (implementation-defined) behaviour 。我将把它作为练习留给你,读者,在这里想出密封处理)并且......甚至不可读的字符串输出。
Yes, of course
make_array
would give you14 116 104 105 115 32 105 115 32 97 32 116 101 115 116
instead ofdGhpcyBpcyBhIHRlc3Q=
, but that's horrifically storage inefficient and still not human readable.
关于c++ - 无法使 C++ Boost 指针序列化工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28901596/
我刚接触 C 语言几周,所以对它还很陌生。 我见过这样的事情 * (variable-name) = -* (variable-name) 在讲义中,但它到底会做什么?它会否定所指向的值吗? 最佳答案
我有一个指向内存地址的void 指针。然后,我做 int 指针 = void 指针 float 指针 = void 指针 然后,取消引用它们以获取值。 { int x = 25; vo
我正在与计算机控制的泵进行一些串行端口通信,我用来通信的 createfile 函数需要将 com 端口名称解析为 wchar_t 指针。 我也在使用 QT 创建一个表单并获取 com 端口名称作为
#include "stdio.h" #include "malloc.h" int main() { char*x=(char*)malloc(1024); *(x+2)=3; --
#include #include main() { int an_int; void *void_pointer = &an_int; double *double_ptr = void
对于每个时间步长,我都有一个二维矩阵 a[ix][iz],ix 从 0 到 nx-1 和 iz 从 0 到 nz-1。 为了组装所有时间步长的矩阵,我定义了一个长度为 nx*nz*nt 的 3D 指针
我有一个函数,它接受一个指向 char ** 的指针并用字符串填充它(我猜是一个字符串数组)。 *list_of_strings* 在函数内部分配内存。 char * *list_of_strings
我试图了解当涉及到字符和字符串时,内存分配是如何工作的。 我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。 另一方面,当我们想要使用内存堆时,我们使用 malloc,
我有一个 C 语言的 .DLL 文件。该 DLL 中所有函数所需的主要结构具有以下形式。 typedef struct { char *snsAccessID; char *
我得到了以下数组: let arr = [ { children: [ { children: [], current: tru
#include int main(void) { int i; int *ptr = (int *) malloc(5 * sizeof(int)); for (i=0;
我正在编写一个程序,它接受一个三位数整数并将其分成两个整数。 224 将变为 220 和 4。 114 将变为 110 和 4。 基本上,您可以使用模数来完成。我写了我认为应该工作的东西,编译器一直说
好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案.... 我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下: 标题: class
1) this 指针与其他指针有何不同?据我了解,指针指向堆中的内存。如果有指向它们的指针,这是否意味着对象总是在堆中构造? 2)我们可以在 move 构造函数或 move 赋值中窃取this指针吗?
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: C : pointer to struct in the struct definition 在我的初学者类
我有两个指向指针的结构指针 typedef struct Square { ... ... }Square; Square **s1; //Representing 2D array of say,
变量在内存中是如何定位的?我有这个代码 int w=1; int x=1; int y=1; int z=1; int main(int argc, char** argv) { printf
#include #include main() { char *q[]={"black","white","red"}; printf("%s",*q+3); getch()
我在“C”类中有以下函数 class C { template void Func1(int x); template void Func2(int x); }; template void
我在64位linux下使用c++,编译器(g++)也是64位的。当我打印某个变量的地址时,例如一个整数,它应该打印一个 64 位整数,但实际上它打印了一个 48 位整数。 int i; cout <<
我是一名优秀的程序员,十分优秀!