yaLanTingLibs
struct_pack::compatible< T, version > 模板结构体 参考

兼容字段类型 更多...

#include <struct_pack_doc.hpp>

类 struct_pack::compatible< T, version > 继承关系图:
struct_pack::compatible< T, version > 的协作图:

Public 成员函数

constexpr compatible (const compatible &other)=default
 
constexpr compatible (compatible &&other)=default
 
constexpr compatible (std::optional< T > &&other)
 
constexpr compatible (const std::optional< T > &other)
 
constexpr compatibleoperator= (const compatible &other)=default
 
constexpr compatibleoperator= (compatible &&other)=default
 

静态 Public 属性

static constexpr uint64_t version_number = version
 

友元

bool operator== (const compatible< T, version > &self, const compatible< T, version > &other)
 

详细描述

template<typename T, uint64_t version>
struct struct_pack::compatible< T, version >

兼容字段类型

模板参数
T兼容字段的类型
version兼容字段的版本号

这个类使用上类似于std::optional<T>,但其语义是添加一个能够保持向前兼容的字段。

例如:

struct person_v1 {
int age;
std::string name;
};
struct person_v2 {
int age;
std::string name;
};
兼容字段类型
Definition: struct_pack_doc.hpp:260

struct_pack::compatible可以为空值,从而保证向前和向后的兼容性。 例如,序列化person_v2,然后将其按照person_v1来反序列化,多余的字段在反序列化时将会被直接忽略。 反过来说,序列化person_v1,再将其按照person_v2来反序列化,则解析出的person_v2中的compatibale字段均为空值。

compatible字段的版本号可以省略,默认版本号为0。

person_v2 p2{20, "tom", 114.1, "tom"};
auto buf = struct_pack::serialize(p2);
person_v1 p1;
// deserialize person_v2 as person_v1
auto ec = struct_pack::deserialize_to(p1, buf.data(), buf.size());
CHECK(!ec);
auto buf1 = struct_pack::serialize(p1);
person_v2 p3;
// deserialize person_v1 as person_v2
auto ec = struct_pack::deserialize_to(p3, buf1.data(), buf1.size());
CHECK(!ec);
struct_pack::err_code deserialize_to(T &t, const View &v, Args &...args)
从视图中反序列化目的对象
Buffer serialize(const Args &...args)
序列化对象并返回结果

升级接口时应注意保持版本号递增 原则:

1.新增加的compatible字段的版本号,应该大于上一次增加的compatible字段的版本号。

2.不得移除原来的任何一个compatible字段(移除普通字段也会出错,但这种错误是可以被类型校验检查出来的)

假如违反这一原则,那么可能会引发未定义行为。 例如:

struct loginRequest_V1
{
string user_name;
string pass_word;
};
struct loginRequest_V2
{
string user_name;
string pass_word;
};
auto data=struct_pack::serialize(loginRequest_V1{});
loginRequest_V2 req;
//该行为是未定义的!
struct loginRequest_V1
{
string user_name;
string pass_word;
};
struct loginRequest_V2
{
string user_name;
string pass_word;
};
auto data=struct_pack::serialize(loginRequest_V1{});
loginRequest_V2 req;
//该行为是未定义的!

该结构体的文档由以下文件生成: