请教一个boostboost 反序列化化抛出text

序列化——Boost&Serialization库
Boost Serialization库提供了两种序列化方式:插入式,非插入式。两种方法原理一致。前者需要在每个需要序列化的类中添加序列化的成员模板函数。
使用Serialization库需要包含以下头文件:
&boost/archive/text_oarchive.hpp&&&&
&boost/archive/text_iarchive.hpp&
&boost/archive/binary_oarchive.hpp& //二进制
&boost/archive/binary_iarchive.hpp&
&boost/archive/xml_oarchive.hpp&&&&
&boost/archive/xml_iarchive.hpp&
插入式:在需要每个需要序列化的类中添加成员模板函数,如下:
protected:
&&&&&& friend
boost::serialization::
&& &&&& template&class
Archive& &void
serialize(Archive & ar, const unsigned int
&& &&&& {
&&&&&&&&&&&&&&&&&
非插入式:不需要修改类的定义,便可以实现序列化。但需要类提供足够的接口,以访问类的信息。
class Test
public:
template&class
void serialize(Archive &ar, Test
&test, const unsigned int version)
派生类序列化:需要包含基类的序列化
包含头文件:
&boost/serialization/base_object.hpp&
eg:&&&&&&
class Base
{ ……
protected:
&&&&&&&&&&
friend class
boost::serialization::
&& &&&& template&class
Archive& &void
serialize(Archive & ar, const unsigned int
&& &&&& {
&&&&&&&&&&&&&&&&&
ar & m_value1;
private:
&class Derived : public
{……
protected:
&&&&&& friend class
boost::serialization::
&&& template&class
&&& void serialize(Archive
& ar, const unsigned int version)
boost::serialization::base_object&Base&(*this);
&&&&&&& ar
& m_value2;
private:
&&&&&& int
指针序列化:指针序列化时,需要序列化指针所指对象。如果有相同的指针序列化,只有一个对象被序列化了。当读取指针时,对象被创建,地址赋给该指针。读取第二个相同指针时,只需要把第一个指针的值赋给它。
&&&&&& Base*
&&& template&class
&&& void serialize(Archive
& ar, const unsigned int version)
&&& {
&&&&&&& int
&&&&&&& for(i = 0; i
& 10; ++i)
&&&&&&&&&&&
ar & base[i];
普通数组序列化:上面的例子有更简单的做法
&&&&&& Base*
&&& template&class
&&& void serialize(Archive
& ar, const unsigned int version)
&&& {
&&&&&&&&&&
STL集合序列化:
需要包含头文件:
&boost/serialization/list.hpp&
&boost/serialization/map.hpp&
&boost/serialization/vector.hpp&
vector&Base*&
&&& template&class
&&& void serialize(Archive
& ar, const unsigned int version)
&&& {
&&&&&&&&&&
将serialization分成两个函数save()/load():
需要声明宏BOOST_SERIALIZATION_SPLIT_MEMBER()
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。用boost库 ,反序列化怎么写?
&return&0;
反序列化怎么写?&求指点
回复讨论(解决方案)
一样的,怎么序列化,就怎么反序列化,boost的序列化,反序列化都是相同的函数。
一样的,怎么序列化,就怎么反序列化,boost的序列化,反序列化都是相同的函数。
不是太明白
20:55&&&[]
); } Console.WriteLine(&OK:二进制序列化成功&); Console.ReadKey(); } } }
《项目二:反序列化》 创建一个控制台应用程序,命名为“反序列化”,然后再添加引用,将上面的那个项目(序列化的那个控制台),引入到当前项目(反序列化的这个控制台)中来
01:11&&&[]
c#&可以通过xml,soap和二进制方式进行序列经,是已经知道的,但是现在又看到一个Marshal.StructureToPtr和Marshal.PtrToStructure来实现序列化和反序列化,不知道它们有什么区别?
回复讨论(解决方案
19:43&&&[]
&1& 把对象转换为字节序列的过程称为对象的序列化。&&&& 把字节序列恢复为对象的过程称为对象的反序列化。 序列化 序列化 将此类的一个实例序列化为一个文件: 【MyFile.bin 这个文件是把obj对象序列化后持久化存储的文件
11:50&&&[]
;类型异常。请大侠们指教!
回复讨论(解决方案)
你确认你的流是序列化过的吗,如果不是,反序列化要出错
给&DataTable&&&起一个名字&就可以了&&&
1楼,你好,我在服务器端
19:50&&&[]
!= null) { NameChanged(this, null); } name = } } //事件往往是不需要序列化的,反序列化的环境和序列化的环境往往不一致,这就失去了将事件序列化的意义。 [field: NonSerialized] public event
10:33&&&[]
”的定义,并且找不到可接受类型为“System.Collections.Generic.List&int&”的第一个参数的扩展方法“Any”(是否缺少&using&指令或程序集引用?)
不知道怎么解决..还是我程序集的问题?大家帮我看看..
20:14&&&[]
& &&&&private&&String&fangzi=Value. //房子
回复讨论(解决方案)
帮忙把这个正反序列化一下我有些犯迷糊
package&mian
22:47&&&[]
在这边记录一下今天做boost序列化的记录。 只做一下简要记录,不多赘述。因为咱是看 博客学的,多的不会讲。 首先,我从这个博客开始学boost的序列化。
讲得挺详细的,基本是按照外文博客翻译的。 代码写出来以后,出了这个异常: boost::archive::archive_exception
20:04&&&[]
;sys_im_info&&sql_
binary_ia&&&&sql_
发现反序列化的时候,一定要现有序列化的东西,不然就报错。现在就出现问题了,我接收过来的字符串要怎么构造出一个序列化的东西啊。
求助,各位大神,帮帮我
22:04&&&[]
&&&&&/materialGroups&&&&
&&&/style&
&/newStyle&
这种复杂格式如何反序列化&&求大神指教
22:06&&&[]
回复讨论(解决方案)
无法建立模型,这根本不是json字符串,无论是C#解析,还是用浏览器的javascript引擎解析,都会报错,写这字符串的人脑残。
楼上正解,这个字符串不符合json格式
20:26&&&[]BOOST::SERIALIZATION对象序列化 - 为程序员服务
为程序员服务
BOOST::SERIALIZATION对象序列化
需要引用boost库,如下代码:
[C/C++]代码
#include &fstream&
#include &iostream&
#include &boost/archive/text_oarchive.hpp&
#include &boost/archive/text_iarchive.hpp&
class gps_position
friend class boost::serialization::
template&class Archive&
void serialize(Archive &ar, const unsigned int version)
gps_position(){};
gps_position(int d, int m, float s): degrees(d), minutes(m), seconds(s) {}
int main() {
std::ofstream ofs(&serialize.log&);
boost::archive::text_oarchive oa(ofs);
const gps_position g(35, 59, 24.56);
ofs.close();
std::ifstream ifs(&serialize.log&, std::ios::binary);
boost::archive::text_iarchive ia(ifs);
ifs.close();
您可能的代码
相关聚客文章
相关专栏文章| 漏洞检测 |
| 隐藏捆绑 |
最常用的两种C++序列化方案的使用心得(protobuf和boost seriali
> 软件开发 > C++ > 正文最常用的两种C++序列化方案的使用心得(protobuf和boost serialization) 我要投稿1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列
> 软件开发 > C++ >
C++的(和boost serialization)
1. 什么是?
2. 为什么要序列化?好处在哪里?
3. C++对象序列化的四种方法
1. 什么是序列化?
程序员在编写应用程序的时候往往需要将程序的某些数据存储在内存中,然后将其写入某个文件或是将它传输到网络中的另一台计算机上以实现通讯。这个将 程序数据转化成能被存储并传输的格式的过程被称为&序列化&(Serialization),而它的逆过程则可被称为&反序列化& (Deserialization)。
简单来说,序列化就是将对象实例的状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它根据流重构对象。这两个过程结合起来,可以轻 松地存储和传输数据。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。
序列化:将对象变成字节流的形式传出去。
反序列化:从字节流恢复成原来的对象。
2. 为什么要序列化?好处在哪里?
简单来说,对象序列化通常用于两个目的: &
(1) 将对象存储于硬盘上 &,便于以后反序列化使用
(2)在网络上传送对象的字节序列
对象序列化的好处在哪里?网络传输方面的便捷性、灵活性就不说了,这里举个我们经常可能发生的需求:你 有一个数据结构,里面存储的数据是经过很多其它数据通过非常复杂的算法生成的,由于数据量很大,算法又复杂,因此生成该数据结构所用数据的时间可能要很久 (也许几个小时,甚至几天),生成该数据结构后又要用作其它的计算,那么你在调试阶段,每次运行个程序,就光生成数据结构就要花上这么长的时间,无疑代价 是非常大的。如果你确定生成数据结构的算法不会变或不常变,那么就可以通过序列化技术生成数据结构数据存储到磁盘上,下次重新运行程序时只需要从磁盘上读 取该对象数据即可,所花费时间也就读一个文件的时间,可想而知是多么的快,节省了我们的开发时间。
3. C++对象序列化的四种方法
将C++对象进行序列化的方法一般有四种,下面分别介绍:
3.1 Google Protocol Buffers()
Google Protocol Buffers (GPB)是Google内部使用的数据编码方式,旨在用来代替XML进行数据交换。可用于数据序列化与反序列化。主要特性有:
语言中立(Cpp, Java, Python)
3.2 Boost.Serialization
Boost.Serialization可以创建或重建程序中的等效结构,并保存为二进制数据、文本数据、XML或者有用户自定义的其他文件。该库具有以下吸引人的特性:
代码可移植(实现仅依赖于ANSI C++)。
深度指针保存与恢复。
可以序列化STL容器和其他常用模版库。
数据可移植。
非入侵性。
3.3 MFC Serialization
Windows平台下可使用MFC中的序列化方法。MFC 对 CObject 类中的序列化提供内置支持。因此,所有从 CObject 派生的类都可利用 CObject 的序列化协议。
MSDN中的介绍
3.4 .Net Framework
.NET的运行时环境用来支持用户定义类型的流化的机制。它在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。
3.5 简单总结
这几种序列化方案各有优缺点,各有自己的适用场景。其中MFC和.Net框架的方法适用范围很窄,只适用于Windows下,且.Net框架方法还需要.Net的运行环境。参考文献1从序列化时间、反序列化时间和产生数据文件大小这几个方面比较了前三种序列化方案,得出结论如下(仅供参考):
Google Protocol Buffers效率较高,但是数据对象必须预先定义,并使用protoc编译,适合要求效率,允许自定义类型的内部场合使用。
Boost.Serialization 使用灵活简单,而且支持标准C++容器。
相比而言,MFC的效率较低,但是结合MSVS平台使用最为方便。
为了考虑平台的移植性、适用性和高效性,推荐大家使用Google的protobuf和Boost的序列化方案,下面介绍我使用这两种方案的心得及注意事项。
4. 最常用的两种序列化方案使用心得
关于这两种方案的具体使用和示例没什么好写的,因为优秀的参考资料很多,请看后面给出的相关参考资料,这里只给出我使用时的一些心得,方便大家在选择序列化方案时有个正确的参考,避免选择错误,浪费时间。
4.1 Google Protocol Buffers
protobuf相对而言效率应该是最高的,不管是安装效率还是使用效率,protobuf都很高效,而且protobuf不仅用于C++序列化,还可用于Java和Python的序列化,使用范围很广。但在使用过程中要注意两个问题:
(1)protobuf支持的数据类型不是很丰富
protobuf属于轻量级的,因此不能支持太多的数据类型,下面是protobuf支持的基本类型列表,一般都能满足需求,不过在选择方案之前,还是先看看是否都能支持,以免前功尽弃。同样该表也值得收藏,作为我们在定义类型时做参考。
.proto type
使用可变长编码方式,负数时不够高效,应该使用sint32
使用可变长编码方式
使用可变长编码方式,有符号的整型值,编码时比通常的int32高效
总是4个字节,如果数值总是比2^28大的话,这个类型会比uint32高效
总是8个字节,如果数值总是比2^56大的话,这个类型会比uint64高效
总是4个字节
总是8个字节
一个字符串必须是utf-8编码或者7-bit的ascii编码的文本
可能包含任意顺序的字节数据
(2)protobuf不支持二维数组(指针),不支持STL容器序列化
(责任编辑:幽灵学院)
------分隔线----------------------------
Note:Mutex是Windows中用于对线程控制的互斥量。意思是只能...
1 inline函数简介inline函数是由inline关键字来定义,引入in...
网上有很多对于STL空间配置器源码的剖析,之所以这么多人去...
在C++中,库的地位是非常高的。C++之父 Bjarne Stroustrup先...
类的6个默认的成员函数包括:构造函数、析构函数、拷贝构造...
#include#pragma comment(lib, dbghelp.lib)LONG WINAPI Top...
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院请教一个boost反序列化抛出text_iarchive
invalid signature异常的问题?我采用boost的序列化库,将数据信息序列化之后,跨网络传输。
代码如下:
  //反序列化mreq包
&&&&&&&&&&stringstream&os(mreq_ch);
&&&&&&&&&&spfs_log(INFO,low,"ready&to&deserlization,context=%s.",os.str().c_str());
&&&&&&&&&&try&
&&&&&&&&&&{&&&
&&&&&&&&&&&&&&text_iarchive(os)&&//在这一行构造抛出异常
&&&&&&&&&&}&&&
&&&&&&&&&&catch(const&exception&&e)&
&&&&&&&&&&{&&&
&&&&&&&&&&&&&&spfs_log(ERR,high,"text_iarchive&err&%s.",e.what());
&&&&&&&&&&}&&&
但是序列化却没有问题:
  stringstream&os&;
&&&&&text_oarchive(os)&&
&&&&&size_t&req_len=strlen(os.str().c_str());
日志中的异常信息:
text_iarchive&err&invalid&signature
请问这是什么原因造成的呢?
回答1:我用的是binary模式进行序列化,我也遇到同样的问题,通过查看源码,你会发现有个数字4,自己不通过网络,序列化与反序列化都能成功,但是一通过网络就发现不对,不能反序列化,而且还抛出invalid&signature异常,通过查看数据,我的问题是传过来的数据是char,把char转换成string时,会出问题,因为通过序列化后,传输过来的char数据中包含有0,当把char转换成string时数据被切割,导致boost抛异常,可以通过string.insert方法,将接受的数据全部放入到string中,就可成功序列化。希望能够对你有帮助。

我要回帖

更多关于 c boost 序列化 的文章

 

随机推荐