message: Add SER_READ and SER_WRITE for read/write-dependent statements
  Extracted and extended by Pieter Wuille from a comment by Russ
  Yanofsky (see
  https://github.com/bitcoin/bitcoin/pull/18317#discussion_r398625457).
diff: @@ -192,6 +192,8 @@ template<typename X> const X& ReadWriteAsHelper(const X& x) { return x; }
  #define READWRITE(...) (::SerReadWriteMany(s, ser_action, __VA_ARGS__))
  #define READWRITEAS(type, obj) (::SerReadWriteMany(s, ser_action, ReadWriteAsHelper<type>(obj)))
  +#define SER_READ(obj, code) ::SerRead(s, ser_action, obj, [&](Stream& s, typename std::remove_const<Type>::type& obj) { code; })
  +#define SER_WRITE(obj, code) ::SerWrite(s, ser_action, obj, [&](Stream& s, const Type& obj) { code; })
  /**
  * Implement three methods for serializable objects. These are actually wrappers over
  @@ -1104,6 +1106,28 @@ inline void SerReadWriteMany(Stream& s, CSerActionUnserialize ser_action, Args&&
  ::UnserializeMany(s, args...);
  }
  +template<typename Stream, typename Type, typename Fn>
  +inline void SerRead(Stream& s, CSerActionSerialize ser_action, Type&&, Fn&&)
  +{
  +}
  +
  +template<typename Stream, typename Type, typename Fn>
  +inline void SerRead(Stream& s, CSerActionUnserialize ser_action, Type&& obj, Fn&& fn)
  +{
  + fn(s, std::forward<Type>(obj));
  +}
  +
  +template<typename Stream, typename Type, typename Fn>
  +inline void SerWrite(Stream& s, CSerActionSerialize ser_action, Type&& obj, Fn&& fn)
  +{
  + fn(s, std::forward<Type>(obj));
  +}
  +
  +template<typename Stream, typename Type, typename Fn>
  +inline void SerWrite(Stream& s, CSerActionUnserialize ser_action, Type&&, Fn&&)
  +{
  +}
  +
  template<typename I>
  inline void WriteVarInt(CSizeComputer &s, I n)
  {
  