这里应该是序列化的最后一篇。感觉自己写的不是很好,也一点点在学习。这次就不贴上代码了。代码在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. phpcms v9和discuz X3.1实现同步登陆退出论坛(已实现)

    网络上文章很多,按步骤配置好了之后phpcms可以同步登录dz,但是dz登录后状态却无法同步到phpcms,网络上找了很多资料都大同小异,头大.只能自己调试了,废话不多说了.       以下网络上抄 ...

  2. 项目中oracle存储过程记录——经常使用语法备忘

    项目中oracle存储过程记录--经常使用语法备忘 项目中须要写一个oracle存储过程,需求是收集一个复杂查询的内容(涉及到多张表),然后把符合条件的记录插入到目标表中.当中原表之中的一个的日期字段 ...

  3. JAXB完毕XML与Java对象的互转

    这段时间都老忙了,甚至连周末全部人员都在赶产品的进度,想想连续上12天班,人都有点晕了! 到这会儿最终有点时间.所以准备和大家分享一下JAXB,会不会有人认为有点陌生呢?没事,这里跟大伙儿简单的描写叙 ...

  4. 关于更改apache和mysql的路径的问题..

    1.禁用selinux 系统管理->selinux管理->enforing模式..改为disable..然后重启 2.修改httpd.conf的各个路径 索引后发现指向欢迎页面则注释下面这 ...

  5. AngularJS - Apply方法监听model变化

    <body> <div ng-app="myApp"> <div ng-controller="firstController" ...

  6. CentOS5.6 安装RabbitMQ

    步骤参考官方地址:http://www.rabbitmq.com/install-rpm.html我们这个版本按照官方的不能正确安装. 1.安装erlang(官网地址http://www.erlang ...

  7. Linux vi编辑器

    vim在内存缓冲区中处理数据 如果在启动vim时未指定文件名,或者这个文件不存在,vim会新开一段缓冲区来编辑. h 左移一个字符 j 下移一行 k 上移一行 l 右边移一个字符 PageDown(C ...

  8. HBase-java api 基本操作

    使用的是完全分布式,详细信息为: 操作的Java 代码(抄的别人的) package org.admln.hbase; import java.util.ArrayList; import java. ...

  9. cocos2d-x lua 调用onEnter和onExit

    cocos2d-x lua 调用onEnter和onExit version: cocos2d-x 3.6 onEnter和onExit在lua中不会因节点别add和remove而直接被调用,当子节点 ...

  10. MYSQL基础笔记(四)-数据基本操作

    数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...