CAF(C++ actor framework)(序列化之複雜類,分析 還有本身不懂的細思恐極函數實現)(三)

這裏應該是序列化的最後一篇。感受本身寫的不是很好,也一點點在學習。此次就不貼上代碼了。代碼在github上的announce5.cpp。代碼簡單,可是分析下去會有細思恐極的感受!git

先看一下幾個函數是幹什麼的吧。(anounce5.cpp:175 176)github

第一個參數類型爲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這個函數就是返回這個類型。 那麼深究就不去了,意思就是得用那麼個函數告訴我們電腦,有這麼一個類了。this

第二個參數字面意思看了應該懂了,就是一個智能指針。這個tree_type_info 須要去繼承類abstract_uniform_type_info,abstract_uniform_type_info 又繼承了uniform_type_info,終於在uniform_type_info裏面找到了兩函數。(annouce_5.cpp:裏有一段註釋告訴咱們要重寫函數serialize,deserialize)spa

其實看了announce_5.cpp 就知道 都是sink 和source的操做,因此再去看一下類serializer 和deserializer。指針

下面是我從serializer.hpp中摘下來的。下面我就開始不懂了。code

  /// 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中的函數,可是沒有函數體,只有聲明orm

舉個例子blog

我就不信了,因此全局搜索繼承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;
}

但願過幾天再去看可以發現真正的答案。

相關文章
相關標籤/搜索