mirror of
https://github.com/zeek/zeek.git
synced 2025-10-09 01:58:20 +00:00
Add versioning to JSON serializer
This commit is contained in:
parent
dbb3144e2d
commit
9593db1974
3 changed files with 22 additions and 6 deletions
|
@ -36,8 +36,6 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Serializer(std::string name) : name(std::move(name)) {}
|
Serializer(std::string name) : name(std::move(name)) {}
|
||||||
|
|
||||||
private:
|
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -6,24 +6,39 @@
|
||||||
|
|
||||||
namespace zeek::storage::serializer::json {
|
namespace zeek::storage::serializer::json {
|
||||||
|
|
||||||
|
std::string JSON::versioned_name = "JSONv1";
|
||||||
|
|
||||||
std::unique_ptr<Serializer> JSON::Instantiate() { return std::make_unique<JSON>(); }
|
std::unique_ptr<Serializer> JSON::Instantiate() { return std::make_unique<JSON>(); }
|
||||||
|
|
||||||
JSON::JSON() : Serializer("JSON") {}
|
JSON::JSON() : Serializer("JSON") {}
|
||||||
|
|
||||||
std::optional<byte_buffer> JSON::Serialize(ValPtr val) {
|
std::optional<byte_buffer> JSON::Serialize(ValPtr val) {
|
||||||
|
static auto byte_converter = [](u_char c) { return std::byte(c); };
|
||||||
|
|
||||||
byte_buffer buf;
|
byte_buffer buf;
|
||||||
auto json = val->ToJSON();
|
auto json = val->ToJSON();
|
||||||
buf.reserve(json->Len());
|
buf.reserve(json->Len() + versioned_name.size() + 1);
|
||||||
|
|
||||||
std::transform(json->Bytes(), json->Bytes() + json->Len(), std::back_inserter(buf),
|
std::transform(versioned_name.begin(), versioned_name.end(), std::back_inserter(buf), byte_converter);
|
||||||
[](u_char c) { return std::byte(c); });
|
buf.push_back(static_cast<std::byte>(';'));
|
||||||
|
std::transform(json->Bytes(), json->Bytes() + json->Len(), std::back_inserter(buf), byte_converter);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
zeek::expected<ValPtr, std::string> JSON::Unserialize(byte_buffer_span buf, TypePtr type) {
|
zeek::expected<ValPtr, std::string> JSON::Unserialize(byte_buffer_span buf, TypePtr type) {
|
||||||
std::string_view text{reinterpret_cast<std::string::const_pointer>(buf.data()), buf.size()};
|
std::string_view text{reinterpret_cast<std::string::const_pointer>(buf.data()), buf.size()};
|
||||||
return zeek::detail::ValFromJSON(text, type, Func::nil);
|
|
||||||
|
auto semicolon = text.find(';');
|
||||||
|
if ( semicolon == std::string::npos )
|
||||||
|
return zeek::unexpected<std::string>("Version string missing");
|
||||||
|
|
||||||
|
std::string_view version = std::string_view(text).substr(0, semicolon);
|
||||||
|
if ( version != versioned_name )
|
||||||
|
return zeek::unexpected<std::string>(
|
||||||
|
util::fmt("Version doesn't match: %s vs %s", version.data(), versioned_name.c_str()));
|
||||||
|
|
||||||
|
return zeek::detail::ValFromJSON(text.substr(semicolon + 1), type, Func::nil);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace zeek::storage::serializer::json
|
} // namespace zeek::storage::serializer::json
|
||||||
|
|
|
@ -15,6 +15,9 @@ public:
|
||||||
|
|
||||||
std::optional<byte_buffer> Serialize(ValPtr val) override;
|
std::optional<byte_buffer> Serialize(ValPtr val) override;
|
||||||
zeek::expected<ValPtr, std::string> Unserialize(byte_buffer_span buf, TypePtr type) override;
|
zeek::expected<ValPtr, std::string> Unserialize(byte_buffer_span buf, TypePtr type) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::string versioned_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace zeek::storage::serializer::json
|
} // namespace zeek::storage::serializer::json
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue