zoukankan      html  css  js  c++  java
  • 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) = 0;
    
      /// Ends serialization of an object.
      virtual void end_object() = 0;
    
      /// Begins serialization of a sequence of size `num`.
      virtual void begin_sequence(size_t num) = 0;
    
      /// Ends serialization of a sequence.
      virtual void end_sequence() = 0;
    
      /// Writes a single value to the data sink.
      /// @param value A primitive data value.
      virtual void write_value(const primitive_variant& value) = 0;
    
      /// 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) = 0;

    这些注释可以理解,但是我也非常奇怪,都是纯虚函数,实现的过程到那里去了?(难不到我,我用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;
    }

    希望过几天再去看能够发现真正的答案。

  • 相关阅读:
    网站描述description如何编写
    网站关键词布局设置,这样添加关键词排名很容易上来!
    长尾关键词挖掘工具和使用方法
    小站点如何做好长尾词库(600个长尾词排名的经验分享!)
    如何利用seo技术霸屏你的行业关键词排名
    利用seo技术排名热点新闻词引流(日IP增加2万+)
    yagmail模块的使用
    python--接口自动化
    Python--unittest参数化
    Python--日志模块
  • 原文地址:https://www.cnblogs.com/zhejiangxiaomai/p/5262731.html
Copyright © 2011-2022 走看看