oslo_VersionedObject-openstack对象管理库

首先简单介绍几个重要的类对象:

VersionedObjectRegistry对象

这个类是一个单例设计的对象,即在内存中只存在一份,因为内置了__new__方法。每次实例化该对象的时候,都会返回相同的内存首地址。

里面包含method:register,这个方法当成装饰器,放在对象模型中,例如:

@base.NovaObjectRegistry.register

class Instance(base.NovaPersistentObject, base.NovaObject,

               base.NovaObjectDictCompat):

经过上述register静态函数装饰之后,对象Instance就会在base.NovaObjectRegistry._obj_classes对象中,该对象是一个字典类型的列表。例如:key值是对象的名称,value值是类:defaultdict(<class 'list'>, {'A': [<class '__main__.A'>], 'B': [<class '__main__.B'>]})。

因此在服务启动之后,只需要通过base.NovaObjectRegistry._obj_classes就可以获取当前服务中的所有的类名和类。

VersionedObject类

是所有类对象的基类,例如Instance就会继承该类。

1. 该对象的obj_class_from_name静态方法的输入参数有objname和objver,一个是类的名称,一个是类的version,就是从base.NovaObjectRegistry._obj_classes中根据objname和objver获取类,然后进行实例化,得到对象示例。

2. obj_from_primitive静态方法,是将字典对象(即经过RPC传输得到的字典值)转换成对象实例,方法是根据1中的obj_class_from_name方法,获取类对象,然后再调用objclass._obj_from_primitive进行实例化,得到实例对象

3. obj_to_primitive方法:作用是将实例化的对象转换成字典的形式,便于通过消息队列进行传输。

VersionedObjectSerializer类

该类是负责序列化和反序列化的对象,本质上就是调用VersionedObject类中的方法,将实例对象转换成字典,或者将字典转换成实例对象。

以Nova为例:

NovaObjectSerializer继承的是oslo_versionedobjects.base.VersionedObjectSerializer,VersionedObjectSerializer类继承的是oslo_messaging.serializer.NoOpSerializer,在NoOpSerializer类中分别定义了四个方法,    serialize_entity和deserialize_entity分别针对模型的中的类,例如Instance;serialize_context和deserialize_context针对的是context对象。

然后将NovaObjectSerializer作为参数传入到nova.rpc.RequestContextSerializer对象中。整体的目的是为了利用VersionedObjectSerializer中的serialize_entity和deserialize_entity方法,将模型对象转换成字典,以及从字典转换成对象。

例如在oslo_versionedobjects.base.VersionedObjectSerializer.serialize_entity方法中,就是调用obj_to_primitive方法进行对象向字典的转换。obj_to_primitive是类VersionedObject中的方法,Instance对象类继承了VersionedObject,该对象也拥有了该方法,当然也可以进行重写。

总结

在RPC调用的时候,在请求端需要将对象模型转换成字典进行传输,在接收端需要将字典转换成相应的模型实例,因此出现了oslo.versionedobject基础库。

主要做了以下几个工作:

  1. 将对象实例转换成字典,是序列化(serializer)的操作,本质上调用的是oslo_versionedobjects.base.VersionedObject.obj_to_primitive方法;将字典转换成相应的对象实例,是反序列化操作(deserialize_entity),本质上调用的是oslo_versionedobjects.base.VersionedObject.obj_from_primitive方法。
  2. 如何将字典转换成相应的对象实例,是该基础库的一个重点。该库利用单设计实例的思想,将所有的类对象都放在一个全局的字典列表中,key为类的名称,value为类对象列表。根据字典中的namespace、name、version等信息得到类对象,然后再对该类对象进行实例化,得到相应的对象实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值