这里应该是序列化的最后一篇。感觉自己写的不是很好,也一点点在学习。这次就不贴上代码了。代码在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)(序列化之复杂类,分析 还有自己不懂的细思恐极函数实现)(三)的更多相关文章

  1. CAF(C++ actor framework)使用随笔(同步发送 异步与同步等待)(三)

    c). 同步发送, 等待响应, 超时后收到1个系统消息. 贴上代码 #include <iostream> #include "caf/all.hpp" #includ ...

  2. Django REST Framework序列化器

    Django序列化和json模块的序列化 从数据库中取出数据后,虽然不能直接将queryset和model对象以及datetime类型序列化,但都可以将其转化成可以序列化的类型,再序列化. 功能需求都 ...

  3. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  4. 序列化、反序列化(实体类或要序列化的对象类必须实现Serializable接口)

    package com.phone.shuyinghengxie; import java.io.Serializable; /* 一个类的对象要想序列化成功,必须满足两个条件: 该类必须实现 jav ...

  5. 如何用boost::serialization去序列化派生模板类(续)

    在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. ...

  6. rest framework 序列化

    serializers 序列化组件 可以实现很轻松的互相转换,最常用的组件 ,用量最大的组件 源码位置 rest_framework.serializers 源码中需要用到的    rest_fram ...

  7. 在 .NET Framework 中使用 StringBuilder 类

    在 .NET Framework 中使用 StringBuilder 类 String 对象是不可变的.每次使用 System.String 类中的一个方法时,都要在内存中创建一个新的字符串对象,这就 ...

  8. EF(Entity Framework)通用DBHelper通用类,增删改查以及列表

    其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...

  9. rest framework 序列化之depth遇到用户表外键的尴尬情况

    rest framework 序列化之depth遇到用户表外键的尴尬情况 问题:ModelSerializer序列化使用depth=1直接扩表把用户表所有信息查询出来的情况 class xxxSeri ...

随机推荐

  1. Codeforces Round #282 (Div. 1) A. Treasure 水题

    A. Treasure Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/494/problem/A ...

  2. 行规——::GetDC()和::ReleaseDC()配对

    1.今天向客户演示程序,不巧崩溃了.最后发现是使用了GetDC()后没有使用ReleaseDC()引起的. 2.最早听说GetDC()和ReleaseDC()是从前任带头码哥那里听说的,那时候仅仅用& ...

  3. 通过GitHub和Hexo搭建个人博客

    LinEvan个人博客 最终有自己的个人博客,逼格一下子提高说不少. 网上一搜教程一大堆,非常多已经写得非常好了,我就不凑这个热闹了.推荐一篇博文:怎样搭建一个独立博客--简明Github Pages ...

  4. Helpers\FastCache

    Helpers\FastCache phpFastCache is a high-performance, distributed object caching system, generic in ...

  5. Linux shell 脚本攻略之正则表达式入门

    摘自:<Linux shell 脚本攻略> 下面是类似的解释:

  6. Android进阶笔记13:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)

    1.RoboBinding RoboBinding是一个实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架.从简单的角度看,他移除了如addXXListen ...

  7. Android(java)学习笔记103:Map集合的获取功能

    package cn.itcast_01; import java.util.Collection; import java.util.HashMap; import java.util.Map; i ...

  8. javascript 通过面向对象编写圆形数字时钟

    效果如图所示,代码如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  9. CentOS(十)--与Linux文件和目录管理相关的一些重要命令②

    在结束了第二期的广交会实习之后,又迎来了几天休闲的日子,继续学习Linux.在上一篇随笔 Linux学习之CentOS(十七)--与Linux文件和目录管理相关的一些重要命令① 中,详细记录了与Lin ...

  10. Oracle常用命令13(数据库的启动、关闭)

    数据库的启动.关闭 数据库的启动:安装启动.非安装启动.共享启动.独占启动.约束启动.强制启动 --不登陆的方式进入 Sqlplus /nolog 安装启动: Startup {pfile=<f ...