message: FieldWriter for row groups
diff: #include "duckdb/common/types/vector.hpp"
  #include "duckdb/transaction/transaction.hpp"
  #include "duckdb/common/exception.hpp"
  +#include "duckdb/common/field_writer.hpp"
  #include "duckdb/storage/table/column_data.hpp"
  #include "duckdb/storage/table/standard_column_data.hpp"
  #include "duckdb/storage/table/update_segment.hpp"
  @@ -729,9 +730,11 @@ shared_ptr<VersionNode> RowGroup::DeserializeDeletes(Deserializer &source) {
  return version_info;
  }
  -void RowGroup::Serialize(RowGroupPointer &pointer, Serializer &serializer) {
  - serializer.Write<uint64_t>(pointer.row_start);
  - serializer.Write<uint64_t>(pointer.tuple_count);
  +void RowGroup::Serialize(RowGroupPointer &pointer, Serializer &main_serializer) {
  + FieldWriter writer(main_serializer);
  + writer.WriteField<uint64_t>(pointer.row_start);
  + writer.WriteField<uint64_t>(pointer.tuple_count);
  + auto &serializer = writer.GetSerializer();
  for (auto &stats : pointer.statistics) {
  stats->Serialize(serializer);
  }
  @@ -740,16 +743,20 @@ void RowGroup::Serialize(RowGroupPointer &pointer, Serializer &serializer) {
  serializer.Write<uint64_t>(data_pointer.offset);
  }
  CheckpointDeletes(pointer.versions.get(), serializer);
  + writer.Finalize();
  }
  -RowGroupPointer RowGroup::Deserialize(Deserializer &source, const vector<ColumnDefinition> &columns) {
  +RowGroupPointer RowGroup::Deserialize(Deserializer &main_source, const vector<ColumnDefinition> &columns) {
  RowGroupPointer result;
  - result.row_start = source.Read<uint64_t>();
  - result.tuple_count = source.Read<uint64_t>();
  +
  + FieldReader reader(main_source);
  + result.row_start = reader.ReadRequired<uint64_t>();
  + result.tuple_count = reader.ReadRequired<uint64_t>();
  result.data_pointers.reserve(columns.size());
  result.statistics.reserve(columns.size());
  + auto &source = reader.GetSource();
  for (idx_t i = 0; i < columns.size(); i++) {
  auto stats = BaseStatistics::Deserialize(source, columns[i].type);
  result.statistics.push_back(move(stats));
  @@ -761,6 +768,8 @@ RowGroupPointer RowGroup::Deserialize(Deserializer &source, const vector<ColumnD
  result.data_pointers.push_back(pointer);
  }
  result.versions = DeserializeDeletes(source);
  +
  + reader.Finalize();
  return result;
  }
  