这里应该是序列化的最后一篇。感觉自己写的不是很好,也一点点在学习。这次就不贴上代码了。代码在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. Android开发学习之 定制界面风格

    统一的用户界面是可以使得应用程序更友好.要做到用户界面的统一,我们就必须用到风格(style)和主题(theme).OPhone系统提供了很多系统默认的风格和主题,但是很多情况下,这些不能满足我们的需 ...

  2. C++ 排序函数 sort(),qsort()的使用方法

    想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给 ...

  3. 前端js插件

    jquery jquery官方 版本:v 2.1.0v 1.11.0 yquery 暂停更新 版本: v 1.6v 1.5 v 1.4v 1.3 v 1.2v 1.1 v 1.0 jQuery 原型插 ...

  4. c语言中的unsigned 和 signed

    我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数 ...

  5. yum.pid 已被锁定

      刚刚打开虚拟机,然后打算安装sharutils 工具在安装sharutils 工具的时候 终端提示 “/var/run/yum.pid 已被锁定,PID 为 1610 的另一个程序正在运行.” r ...

  6. 基于Qt的开源音乐播放器(CZPlayer)

    CZPlayer CZPlayer是基于Qt开发的一款功能强大的音乐播放器,该播放器的论坛地址请点击here,目前CZPlayer已经是第四个版本了,历史版本也分别在我的github上, github ...

  7. 导入GPUImage,实时滤镜相机,GUPImage遇到的问题解决,_OBJC_METACLASS_$_GBGPUImageView in GBGPUImageView.o

    导入方法转自:http://www.cnblogs.com/S2-huai/p/3881349.html.. (原文:http://www.cnblogs.com/YouXianMing/p/3709 ...

  8. HBase-初看HBase

    0.95版本hbase 单机模式下所有的服务都运行在一个JVM上,包括HBase和zookeeper.使用的是本地文件系统 日志默认放在目录下logs文件夹中 基本命令: create 'table' ...

  9. Android自定义View,高仿QQ音乐歌词滚动控件!

    最近在以QQ音乐为样板做一个手机音乐播放器,源码下篇博文放出.今天我想聊的是这个QQ音乐播放器中歌词显示控件的问题,和小伙伴们一起来探讨怎么实现这个歌词滚动的效果.OK,废话不多说,先来看看效果图: ...

  10. Android(java)学习笔记105:Map集合的遍历之键值对对象找键和值

    package cn.itcast_01; import java.util.HashMap; import java.util.Map; import java.util.Set; /* * Map ...