#ifndef STORAGE_LEVELDB_UTIL_SERIALIZE_VALUE_H_ #define STORAGE_LEVELDB_UTIL_SERIALIZE_VALUE_H_ #include #include #include #include #include "leveldb/slice.h" #include "util/coding.h" namespace leveldb{ using Field = std::pair; // field_name:field_value using FieldArray = std::vector>; std::string SerializeValue(const FieldArray& fields); FieldArray *ParseValue(const std::string& value_str); class InternalFieldArray { public: using FieldMap = std::map; InternalFieldArray(const FieldArray &fields, bool to_map = false):fields(fields),isMapped(false) { if(to_map) Map(); } InternalFieldArray(const std::string& value_str) { Slice valueSlice(value_str); Slice nameSlice,valSlice; while(GetLengthPrefixedSlice(&valueSlice, &nameSlice)) { if(GetLengthPrefixedSlice(&valueSlice, &valueSlice)) { map[nameSlice.ToString()] = valueSlice.ToString(); } else { std::cout << "name and val not match!" << std::endl; } nameSlice.clear(); valSlice.clear(); } } InternalFieldArray(const Slice& slice):leveldb::InternalFieldArray(slice.ToString()) {} //将vector变为用map存 void Map(); std::string Serialize(); bool HasField(const Field& field); private: bool isMapped; const FieldArray fields; FieldMap map; }; } #endif