[C++] 简单序列化
创始人
2024-06-01 17:30:38
0

前言

序列化(Serialization)
是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

使用

序列化

		std::array arr = {147};std::initializer_list lst = {951, 623};std::vector vec = {123, 456, 789};ntl::Serialization ser2 = ntl::Serializer::serialize(arr);ntl::Serialization ser3 = ntl::Serializer::serialize(lst);ntl::Serialization ser4 = ntl::Serializer::serialize(vec);

反序列化

		std::vector vec2;std::vector vec3;std::vector vec4;ntl::Deserializer::deserialize(ser2, vec2);ntl::Deserializer::deserialize(ser3, vec3);ntl::Deserializer::deserialize(ser4, vec4);

代码

序列化的代码算不上多,但也不少,可以在github上找到完整版

Serializable

Serializable就是能被序列化的对象,有三个接口:

virtual Serialization serialize() = 0;
virtual Serialization serialize() const = 0;
virtual SelfType &deserialize(const Serialization &serialization) = 0;

用于序列化与反序列化

	/// @brief 可序列化的对象class NTL_ALIGN Serializable : public Object{public:using SelfType = Serializable;using ParentType = Object;public:constexpr Serializable() noexcept = default;constexpr explicit Serializable(const SelfType &from) noexcept = default;~Serializable() override = default;public:constexpr SelfType &operator=(const SelfType &from) noexcept = default;public:/// @brief 序列化本对象/// @return 序列virtual Serialization serialize() = 0;/// @brief 序列化本对象/// @return 序列virtual Serialization serialize() const = 0;/// @brief 反序列化至本对象/// @param serialization 序列/// @return 本对象virtual SelfType &deserialize(const Serialization &serialization) = 0;};

Serialization

Serialization就更简单的,就是一封装了的字符串

	/// @brief 序列class NTL_ALIGN Serialization : public Object{public:using SelfType = Serialization;using ParentType = Object;protected:/// @brief 序列String m_serialization;public:Serialization() = default;explicit Serialization(const String &serialization);explicit Serialization(const SelfType &from) = default;~Serialization() override = default;public:SelfType &operator=(const SelfType &from) = default;operator String();operator String() const;public:/// @brief 获取序列/// @return 序列const ntl::String &get_serialization() const;/// @brief 设置序列/// @param serialization 序列/// @return 本对象SelfType &set_serialization(const ntl::String &serialization);};

Serializer

Serializer主要负责序列化基础类型

	/// @brief 序列化器class NTL_ALIGN Serializer : public Object{public:using SelfType = Serializer;using ParentType = Object;public:Serializer() = default;explicit Serializer(const SelfType &from) = default;~Serializer() override = default;public:SelfType &operator=(const SelfType &from) = default;public:static Serialization serialize(const Serializable &object);static Serialization serialize(char value);template static Serialization serialize(const ValueType &value);template static Serialization serialize(const std::basic_string &str);template static Serialization serialize(const std::array &container);template static Serialization serialize(const std::vector &container);template static Serialization serialize(const std::initializer_list &container);template static Serialization serialize_container(const IteratorType &begin, const IteratorType &end);template static Serialization serialize_container(const ElementType *begin, SizeT size);};

Deserializer

Deserializer也是一样的,但是多了对序列的检查
其中用于检测的正则表达式长这样:

String Deserializer::regex_is_integer = NTL_STRING("[0-9]+");
String Deserializer::regex_is_float0 = NTL_STRING("[0-9]+[fd]?");
String Deserializer::regex_is_float1 = NTL_STRING("[0-9]+.[fd]?");
String Deserializer::regex_is_float2 = NTL_STRING(".[0-9]+[fd]?");
String Deserializer::regex_is_float3 = NTL_STRING("[0-9]+.[0-9]+[fd]?");
String Deserializer::regex_is_string = NTL_STRING("\"(.*)\"");
	/// @brief 反序列化器class NTL_ALIGN Deserializer : public Object{public:using SelfType = Deserializer;using ParentType = Object;/// @brief 整数static String regex_is_integer;/// @brief 浮点数,形如123static String regex_is_float0;/// @brief 浮点数,形如123.static String regex_is_float1;/// @brief 浮点数,形如.123static String regex_is_float2;/// @brief 浮点数,形如123.123static String regex_is_float3;/// @brief 是否为字符串,形如"abc"static String regex_is_string;public:Deserializer() = default;explicit Deserializer(const SelfType &from) = default;~Deserializer() override = default;public:SelfType &operator=(const SelfType &from) = default;public:template static ResultType deserialize(const Serialization &serialization);static void deserialize(const Serialization &serialization, Serializable &result);static void deserialize(const Serialization &serialization, char &result);static void deserialize(const Serialization &serialization, short &result);static void deserialize(const Serialization &serialization, int &result);static void deserialize(const Serialization &serialization, long &result);static void deserialize(const Serialization &serialization, long long &result);static void deserialize(const Serialization &serialization, float &result);static void deserialize(const Serialization &serialization, double &result);template static void deserialize(const Serialization &serialization, std::basic_string &result);template static void deserialize(const Serialization &serialization, std::vector &result);public:/// @brief 生成一个异常/// @param type 类型/// @return 异常static InvalidArgumentException make_exception(const String &type);/// @brief 检查是否为整数/// @param serialization 序列/// @return 是否为整数static bool is_integer(const Serialization &serialization);/// @brief 检查是否为浮点数/// @param serialization 序列/// @return 是否为浮点数static bool is_float(const Serialization &serialization);/// @brief 检查是否为字符串/// @param serialization 序列/// @return 是否为字符串static bool is_string(const Serialization &serialization);};

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...