反射、序列化与反序列化之间的联系

本文根据校内竞赛,将c++对象存取redis中并且根据这一需求,设计以反射思想进行序列化与反序列化。因为c++并没有原生的反射和序列化,需要了解java的反射机制的,可以参考我别的内容(当然我没写呢),所以写本文作为基础资料。

首先先简单介绍一下各自的概念与用处。

  1. 反射:程序可以通过访问全限定类名,对类对象信息进行反向获取,对其进行检测和修改。
  2. 序列化:也就是将对象的状态信息转换为可以存储或传输的形式的过程。
  3. 反序列化:将传输得到的数据信息还原成对象的状态信息。

反射分为编译时反射和运行时反射:

  1. 编译期就是将源码编译成可执行文件,只对代码进行翻译,并不将相应的代码放到内存中运行起来,编译器反射就是在编译的时候获取全限定类名,并通过类名将相应信息加载到内存中准备调用。
  2. 运行时反射就是程序在计算机中运行时,当加载到该类时,通过全限定类名访问类对象属性和方法。

反射与序列化的关系:

序列化需要将一个对象信息转化为某种可以保存和传输的格式,而要将类对象序列化为某种格式有两种方式:
1,熟悉类的结构,例如知道类中的属性和方法,可以直接序列化相应的类属性信息,将类对象保存为一个格式。
2,不熟悉类的结构,在调用实例化对象时候,需要将类对象信息封装为某个格式进行传输,这时就需要动态的解析出该类中的属性和方法了,这就可以通过【 反射】来实现,反射动态的获取到类的属性和方法,从而对其进行序列化的操作。

反射与反序列化的关系:

与序列化关系相反,一个类对象如果想要反序列化,首要的就是先【 反射】出原始类的属性信息,通过传输过来的格式化信息,对格式化信息进行解析并进行属性赋值。

当然反射机制在java中使用更多,JVM中常常通过反射机制进行动态的修改和检查,还有一些注解模式,往往通过反射机制,将其相应的操作进行实现。

序列化的方式有两种(未知类对象结构):

1,侵入式

class BaseCall
{
public:
    BaseCall(){}
    virtual ~BaseCall() {}
    virtual int getYY() = 0;
    Config get_config()const
    {
        Config config=Serializable::get_config(this);
        config.update({
              {"getYY",getYY}
                      });
        return config;
    }
};

可以看到,我在原类中加入了一段Config的配置用于实现序列化,而这段代码改变了原类对象的代码内容,并且在编译后会增加编译文件的内容,如果这种就是侵入式序列化(也就是本次做的内容主要使用的方法)。

2,非侵入式

非侵入式就是没有上述的那段代码,在外部的序列化定义中加入需要相关的属性信息。但是这种序列化有种问题,他需要你将你类中的属性信息设置为public,这就导致了他类中属性信息的暴露,对于部分是接受不了的,所以我没采用这种方式。

这两种方式在boost中序列化中都有使用,可以参考boost的使用,boost被称为c++标准库,实现了序列化/反序列化等方法。

接下来就是这个竞赛的全实现过程了。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值