message: Add serialization for unique_ptr and shared_ptr
diff: #include <ios>
  #include <limits>
  #include <map>
  +#include <memory>
  #include <set>
  #include <stdint.h>
  #include <string.h>
  static const unsigned int MAX_SIZE = 0x02000000 * 8; // BU Allow 256MB JSON encodings
  +/**
  + * Dummy data type to identify deserializing constructors.
  + *
  + * By convention, a constructor of a type T with signature
  + *
  + * template <typename Stream> T::T(deserialize_type, Stream& s)
  + *
  + * is a deserializing constructor, which builds the type by
  + * deserializing it from s. If T contains const fields, this
  + * is likely the only way to do so.
  + */
  +struct deserialize_type
  +{
  +};
  +constexpr deserialize_type deserialize{};
  +
  /**
  * Used to bypass the rule against non-const reference to temporary
  * where it makes sense with wrappers such as CFlatData or CTxDB
  @@ -691,6 +708,22 @@ void Serialize(Stream &os, const std::set<K, Pred, A> &m);
  template <typename Stream, typename K, typename Pred, typename A>
  void Unserialize(Stream &is, std::set<K, Pred, A> &m);
  +/**
  + * shared_ptr
  + */
  +template <typename Stream, typename T>
  +void Serialize(Stream &os, const std::shared_ptr<const T> &p);
  +template <typename Stream, typename T>
  +void Unserialize(Stream &os, std::shared_ptr<const T> &p);
  +
  +/**
  + * unique_ptr
  + */
  +template <typename Stream, typename T>
  +void Serialize(Stream &os, const std::unique_ptr<const T> &p);
  +template <typename Stream, typename T>
  +void Unserialize(Stream &os, std::unique_ptr<const T> &p);
  +
  /**
  * If none of the specialized versions above matched, default to calling member function.
  @@ -933,6 +966,38 @@ void Unserialize(Stream &is, std::set<K, Pred, A> &m)
  }
  +/**
  + * unique_ptr
  + */
  +template <typename Stream, typename T>
  +void Serialize(Stream &os, const std::unique_ptr<const T> &p)
  +{
  + Serialize(os, *p);
  +}
  +
  +template <typename Stream, typename T>
  +void Unserialize(Stream &is, std::unique_ptr<const T> &p)
  +{
  + p.reset(new T(deserialize, is));
  +}
  +
  +
  +/**
  + * shared_ptr
  + */
  +template <typename Stream, typename T>
  +void Serialize(Stream &os, const std::shared_ptr<const T> &p)
  +{
  + Serialize(os, *p);
  +}
  +
  +template <typename Stream, typename T>
  +void Unserialize(Stream &is, std::shared_ptr<const T> &p)
  +{
  + p = std::make_shared<const T>(deserialize, is);
  +}
  +
  +
  /**
  * Support for ADD_SERIALIZE_METHODS and READWRITE macro
  */
  