CAF(C++ actor framework)(序列化之结构体,任意嵌套STL)(一)

User-Defined Data Types in Messages(用户自定义类型)
All user-defined types must be explicitly “announced” so that CAF can (de)serialize them correctly.

之前干活,一开始不知道CAF自带序列化,都用boost库来做序列化,就是变string 类型发送,发现很多STL有些搞搞比较麻烦,发现诶?CAF居然比boost库好使!

那么就来搞一下看看.

先看一个例子(也是usermanual 里唯一的一个例子,呵呵呵~)其他的例子在github官网里https://github.com/actor-framework/actor-framework/tree/master/examples/type_system (就五个收益很大)

 

没看错就是那么简单的使用,announce函数。第一个参数是一个string那么之后就是他的所有成员。怎么实现我也不是很懂,上图

大致就是TS 就是参数的类型,可以是可变长度,然后检查他们的类型,我第一看到Is_pod 查了一下(pod类型 是plain old data)就是完全兼容C语言的编程的。(涨姿势了~)

还有uniform_type_info是CAF自己的一个关于类型什么的(没深究,只知道与RTTI有关)。还有一个重要的地方就是你必须写明你要发送的结构体的比较函数 ==(下面代码上有)

进入正题。(announce1.cpp)代码有一点点小长但是信息量很大。

// POD struct
struct foo {std::vector<int> a;int b;
};// announce requires foo to have the equal operator implemented
bool operator==(const foo& lhs, const foo& rhs) {return lhs.a == rhs.a && lhs.b == rhs.b;
}// a pair of two ints
using foo_pair = std::pair<int, int>;// another pair of two ints
using foo_pair2 = std::pair<int, int>;// a struct with member vector<vector<...>>
struct foo2 {int a;vector<vector<double>> b;
};bool operator==(const foo2& lhs, const foo2& rhs) {return lhs.a == rhs.a && lhs.b == rhs.b;
}// receives `remaining` messages
void testee(event_based_actor* self, size_t remaining) {auto set_next_behavior = [=] {if (remaining > 1) testee(self, remaining - 1);else self->quit();};self->become (// note: we sent a foo_pair2, but match on foo_pair// that's safe because both are aliases for std::pair<int, int>[=](const foo_pair& val) {cout << "foo_pair("<< val.first << ", "<< val.second << ")"<< endl;set_next_behavior();},[=](const foo& val) {cout << "foo({";auto i = val.a.begin();auto end = val.a.end();if (i != end) {cout << *i;while (++i != end) {cout << ", " << *i;}}cout << "}, " << val.b << ")" << endl;set_next_behavior();});
}int main(int, char**) {// announces foo to the libcaf type system;// the function expects member pointers to all elements of fooannounce<foo>("foo", &foo::a, &foo::b);// announce foo2 to the libcaf type system,// note that recursive containers are managed automatically by libcafannounce<foo2>("foo2", &foo2::a, &foo2::b);// serialization can throw if types are not announced properlytry {// init some test data
    foo2 vd;vd.a = 5;vd.b.resize(1);vd.b.back().push_back(42);// serialize test datavector<char> buf;binary_serializer bs(std::back_inserter(buf));bs << vd;// deserialize written test data from buffer
    binary_deserializer bd(buf.data(), buf.size());foo2 vd2;uniform_typeid<foo2>()->deserialize(&vd2, &bd);// deserialized data must be equal to original inputassert(vd == vd2);// announce std::pair<int, int> to the type systemannounce<foo_pair>("foo_pair", &foo_pair::first, &foo_pair::second);// libcaf returns the same uniform_type_info// instance for the type aliases foo_pair and foo_pair2assert(uniform_typeid<foo_pair>() == uniform_typeid<foo_pair2>());}catch (std::exception& e) {cerr << "error during type (de)serialization: " << e.what() << endl;return -1;}// spawn a testee that receives two messages of user-defined typeauto t = spawn(testee, size_t{2});{ // lifetime scope of self
    scoped_actor self;// send t a fooself->send(t, foo{std::vector<int>{1, 2, 3, 4}, 5});// send t a foo_pair2self->send(t, foo_pair2{3, 4});}await_all_actors_done();shutdown();
}

一开始看,就是声明了两种结构体。foo 和foo2,foo2里面有vector<vector<double>> b(其实这里就告诉我们,它不但支持STL,还支持嵌套,而且我亲测pair,map都是可以的。其他应该也没问题吧。)

然后testee里定义了接受两种类型的消息一种是<int,int>(不管别名),一种是结构体foo 是的没看错,都不用序列化了,直接传(// note that recursive containers are managed automatically by libcaf)。

真心方便,然后是main函数里,使用了二进制去序列化类,再使用反序列化,整个过程就像用读文件非常的方便(注意捕获异常)。那么在最后的scoped_actor send也直接把类传过去非常的方便。

为了证明好用,支持remote actor我写了一个很难看的代码。

#include <vector>
#include <iostream>
#include "caf/all.hpp"
#include "caf/io/all.hpp"
using std::cout;
using std::endl;
using std::vector;
using std::map;
using std::pair;
using namespace caf;struct foo {std::vector<vector<map<int,pair<int,int>>>> a;int b;
};
bool operator==(const foo& lhs, const foo& rhs) {return lhs.a == rhs.a && lhs.b == rhs.b;
}
// receives `remaining` messages
void testee(event_based_actor* self) {self->become ([=](const foo& val) {aout(self)<<"get it"<<endl;});
}
int main(int, char**) {
//  announce<foo2>("foo2", &foo2::a, &foo2::b);announce<foo>("foo", &foo::a, &foo::b);auto actor = spawn(testee);caf::io::publish(actor,10000);{ // lifetime scope of self
    scoped_actor self;auto remoter = caf::io::remote_actor("localhost", 10000);self->send(remoter, foo{std::vector<vector<map<int,pair<int,int>>>>{},1,});}await_all_actors_done();shutdown();
}

结果为

不得不服还是很方便的!

码字不容易,求粉丝~互粉呀~

 

转载于:https://www.cnblogs.com/zhejiangxiaomai/p/5259625.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/418901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构实验二 树和二叉树的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418A&#xff09; 2019年5月13日 学院 计算机科学与教育软件学院 年级、专业、班 计算机科学与技术172班 姓名 学号 17061 实验课程名称 数据结构实验 成绩 实验项目名…

前端学习(1800):前端调试之清除浮动练习1

<!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title><link r…

ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤

ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤 原文:ArcGIS生成根据点图层生成等值面并减小栅格锯齿的操作步骤一、打开ArcMAP并加载上相应的点图层和边界面图层 二、ArcToolbox--Spatial Analyst工具--差值分析--克里金法(根据不同的情况选择不同的算法&#xff0c…

数据结构实验三 树的遍历生成树

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418A&#xff09; 2019年4月19日 学院 计算机科学与教育软件学院 年级、专业、班 计算机科学与技术 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验三…

前端学习(1800):前端调试之清除浮动练习2

<!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title><!-- 不…

java參数传递机制浅析

欢迎转载&#xff0c;转载请声明出处&#xff01;-----------------------------------------前言&#xff1a;java语言中&#xff0c;參数的传递仅仅有一种机制。那就是值传递。 举例&#xff1a;以下将通过几个样例来说明java中的參数传递机制&#xff0c;这些样例基本涵盖了…

数据库实验四 用户权限管理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼418B&#xff09; 2019年5月22日 学院 计算机科学与网络工程学院 年级、专业、班 计科172 姓名 学号 实验课程名称 数据库原理实验 成绩 实验项目名称 用户权限管理…

前端学习(1801):前端调试之清除浮动练习3

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

Java编程思想学习(一) 一切都是对象

前言 Java是基于C的&#xff0c;但Java是一种更加纯粹的面向对象程序设计语言。 C和Java都是混合&#xff0f;杂合型语言。杂合型语言允许多种编程风格。 用引用操纵对象 每种编程语言都有自己操纵内存中元素的方式。 直接操纵元素用某种基于特殊语法的间接表示&#xff08;C和…

C++学习笔记之对文件的操作1

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126545.html ** 前言 我们在编写程序的时候&#xff0c;最密不可分的就是对文件进行相应的操作&#xff0c;我们可以从文件中读取数据&#xff0c;可以将数据保存到文件&#xff0c;可以…… 总而言之&…

C++学习笔记之对文件的操作2

转载自** https://www.cnblogs.com/uniqueliu/archive/2011/08/03/2126680.html ** 什么都不说了&#xff0c;继续《C学习笔记之对文件的操作<1>》的内容… 功能展示 打开文件的方式 当我们想要打开的文件不存在的时候&#xff0c;一般地&#xff0c;ofstream类的对象…

前端学习(1802):前端调试之事件伪类练习

index.html <!DOCTYPE html> <html lang"en"><head> <!--系统内置 start--> <script type"text/javascript"></script> <!--系统内置 end--><meta charset"UTF-8"><title>练习</titl…

前端学习(1809):前端调试之微博头部开发

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>微博实战--head&l…

数据结构实验四 排序算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416&#xff09; 2019年6月4日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验四 排序算法 指导老…

数据结构实验五 查找算法的实现

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416B&#xff09; 2019年6月11日 学院 计算机科学与教育软件学院 年级、专业、班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验五 查找算法 指导…

前端学习(1811):前端调试之css装饰cursor练习

index.html <!DOCTYPE html> <html lang"en"><head><!--系统内置 start--><script type"text/javascript"></script><!--系统内置 end--><meta charset"UTF-8"><title>练习</title&g…

数据结构实验六 综合数据处理

广州大学学生实验报告 开课实验室&#xff1a;计算机科学与工程实验&#xff08;电子楼416A&#xff09; 2019年6月14日 学院 计算机科学与教育软件学院 年级、专业、班 计算机大类 144班 姓名 学号 实验课程名称 数据结构实验 成绩 实验项目名称 实验六…