CAF(C++ actor framework)(序列化之复杂类,分析 还有自己不懂的细思恐极函数实现)(三)
这里应该是序列化的最后一篇。感觉自己写的不是很好,也一点点在学习。这次就不贴上代码了。代码在github上的announce5.cpp。代码简单,但是分析下去会有细思恐极的感觉!
先看一下几个函数是干什么的吧。(anounce5.cpp:175 176)

第一个参数类型为type_info,(我也是第一次看到,去查了资料简单的说就是存了类的信息(Stores information about a type.原话)
An object of this class is returned by the typeid operator (as a const-qualified lvalue). Although its actual dynamic type may be of a derived class.原话)
那么用typeid这个函数就是返回这个类型。 那么深究就不去了,意思就是得用那么个函数告诉咱们电脑,有这么一个类了。

第二个参数字面意思看了应该懂了,就是一个智能指针。这个tree_type_info 需要去继承类abstract_uniform_type_info,abstract_uniform_type_info 又继承了uniform_type_info,终于在uniform_type_info里面找到了两函数。(annouce_5.cpp:里有一段注释告诉我们要重写函数serialize,deserialize)

其实看了announce_5.cpp 就知道 都是sink 和source的操作,所以再去看一下类serializer 和deserializer。
下面是我从serializer.hpp中摘下来的。下面我就开始不懂了。
/// Begins serialization of an object of type `uti`.
virtual void begin_object(const uniform_type_info* uti) = ; /// Ends serialization of an object.
virtual void end_object() = ; /// Begins serialization of a sequence of size `num`.
virtual void begin_sequence(size_t num) = ; /// Ends serialization of a sequence.
virtual void end_sequence() = ; /// Writes a single value to the data sink.
/// @param value A primitive data value.
virtual void write_value(const primitive_variant& value) = ; /// Writes a raw block of data.
/// @param num_bytes The size of `data` in bytes.
/// @param data Raw data.
virtual void write_raw(size_t num_bytes, const void* data) = ;
这些注释可以理解,但是我也非常奇怪,都是纯虚函数,实现的过程到那里去了?(难不到我,我用sublime ctrl+shift+F 全局搜了起来)最后找到,在binary_serializer.hpp,binary_deserializer.hpp中继承了desrializer中的函数,但是没有函数体,只有声明
举个例子

我就不信了,所以全局搜索继承binary_sericalizer类的类,发现惊呆了,居然没有了,那么这些begin_sequence()函数去那里实现的呢(又搜了 还是没搜到!?)诶,在这里意识到水平不够用了。。
留个包袱,希望哪位朋友大神可以告诉我为什么。我自己的理解是毕竟调用还是看具体传进去的类型,但是我全局搜索也没发现有任何重写函数,
但是我在deserializer.hpp(108 ~133)的中看到下面这一段代码,可能才是真正的反序列化吧。
/// Serializes a value to `s`.
/// @relates serializer
template <class T>
typename std::enable_if<
detail::is_primitive<T>::value,
deserializer&
>::type
operator>>(deserializer& source, T& value) {
return source.read(value);
} /// Serializes a value to `s`.
/// @relates serializer
template <class T>
typename std::enable_if<
! detail::is_primitive<T>::value,
deserializer&
>::type
operator>>(deserializer& source, T& value) {
return source.read(value, uniform_typeid<T>());
} template <class T>
void operator&(deserializer& source, T& value) {
source >> value;
}
希望过几天再去看能够发现真正的答案。
CAF(C++ actor framework)(序列化之复杂类,分析 还有自己不懂的细思恐极函数实现)(三)的更多相关文章
- CAF(C++ actor framework)使用随笔(同步发送 异步与同步等待)(三)
c). 同步发送, 等待响应, 超时后收到1个系统消息. 贴上代码 #include <iostream> #include "caf/all.hpp" #includ ...
- Django REST Framework序列化器
Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...
- [Django REST framework - 序列化组件、source、钩子函数]
[Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...
- 序列化、反序列化(实体类或要序列化的对象类必须实现Serializable接口)
package com.phone.shuyinghengxie; import java.io.Serializable; /* 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 jav ...
- 如何用boost::serialization去序列化派生模板类(续)
在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. ...
- rest framework 序列化
serializers 序列化组件 可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件 源码位置 rest_framework.serializers 源码中需要用到的 rest_fram ...
- 在 .NET Framework 中使用 StringBuilder 类
在 .NET Framework 中使用 StringBuilder 类 String 对象是不可变的.每次使用 System.String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就 ...
- EF(Entity Framework)通用DBHelper通用类,增删改查以及列表
其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...
- rest framework 序列化之depth遇到用户表外键的尴尬情况
rest framework 序列化之depth遇到用户表外键的尴尬情况 问题:ModelSerializer序列化使用depth=1直接扩表把用户表所有信息查询出来的情况 class xxxSeri ...
随机推荐
- 2015 NOIP day1 t1 神奇的幻方 模拟
神奇的幻方 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2615 Descri ...
- 算法:排序----Java选择排序
public static void selectionSort(int[] arr) { int len = arr.length; for (int i = 0; i < len; i++) ...
- OSG中的示例程序简介(转)
OSG中的示例程序简介 1.example_osganimate一)演示了路径动画的使用 (AnimationPath.AnimationPathCallback),路径动画回调可以作用在Camera ...
- Android通过http协议POST传输方式
Android通过http协议POST传输方式如下: 方式一:HttpPost(import org.apache.http.client.methods.HttpPost) 代码如下: privat ...
- 分享一个jQuery动态网格布局插件:Masonry(转)
在线演示 Masonry是 一款非常强大的jQuery动态网格布局插件,可以帮助开发人员快速开发类似剪贴画的界面效果.和CSS中float的效果不太一样的地方在 于,float先水平排列,然后再垂直排 ...
- 如何通过VIM把代码格式化后生成HTML网页代码
本文转自http://wangxiaoyu.blog.51cto.com/922065/203471 需求及思路:演示需要,需要网站上嵌入一些代码,我的建议做法是根据代码文件,生成相应的HTML代码, ...
- day02 Java基础
1.Java中的关键字都是小写的. 2.Java中的关键字 3.Java中的注释分为:单行注释.多行注释.文档注释 文档注释将被javadoc工具解析生成一个说明书. 4.Java中的常量分为字面值常 ...
- PAT 1002
1002. A+B for Polynomials (25) This time, you are supposed to find A+B where A and B are two polynom ...
- Understanding Spring Web Application Architecture: The Classic Way--转载
原文地址:http://www.petrikainulainen.net/software-development/design/understanding-spring-web-applicatio ...
- Yar - Yet Another RPC framework for PHP
Introduction Yar is a RPC framework which aims to provide a simple and easy way to do communication ...