实现原理
ScalaPegasusClient
接口通过持有ScalaPegasusTable
实现对特定表的访问,而ScalaPegasusTable
实际是封装了Java client的接口PegasusTableInterface
而实现的。函数形式如下所示:
- def get[H, S](table: String, hashKey: H, sortKey: S)(implicit hSer: SER[H], sSer: SER[S]) = {
- getTable(table).get(hashKey, sortKey)
- }
每一个数据表的操作函数都被定义为泛型函数,参数列表(table: String, hashKey: H, sortKey: S)
是实际传入的参数,同时使用隐式参数(implicit hSer: SER[H], sSer: SER[S])
完成对参数列表(table: String, hashKey: H, sortKey: S)
泛型的转换。其中SER[H]是类Serializers
的泛型声明,该类包含对不同泛型对象的隐式转换函数(转换成Java client中PegasusTableInterface
的byte[]参数
,在scala中对应为Array[Byte]
,例子展示的是当泛型在使用的时候被定义为String
时的隐式转换函数:
- implicit object Utf8String extends Serializer[String] {
- override def serialize(obj: String): Array[Byte] = if (obj == null) null else obj.getBytes("UTF-8")
- override def deserialize(bytes: Array[Byte]): String = if (bytes == null) null else new String(bytes, "UTF-8")
- }
客户端在调用ScalaPegasusClient
提供的方法时,当对第一个参数列表的泛型参数传入String
类型变量的时候,将被自动转换为Array[Byte]
类型变量,并传入PegasusTableInterface
的对应方法中。请确保包含Serializers._
,否则无法完成参数的类型转换,你可以使用:
- import com.xiaomi.infra.pegasus.scalaclient.Serializers._
导入依赖,目前接受的自动类型转换包括String
、Boolean
、Int
、Long
、Short
、Double
,这些类型可自动转换为Array[Byte]
。