0
그래서 LabelledGenerics를 사용하여 CaseClass 객체를 작성하기 전에 올바른 순서로 HList를 가져올 수 없습니다. 무엇 작동하지 않는 것은Scala Shapeless를 사용하여 [String, Array Byte]를 CaseClass에 매핑하십시오.
case class Foo(a:int, b:String)
val serializedRecord("a" -> somebytes, "b" -> someotherbytes)
val caseClassObject = HBaseSerDe[Foo].deserialize(serializedRecord)
입니다
무엇 지금 작동하는 것은 : 내가 읽고 내가 내 Hlist 전에 정리 얻기 위해 정렬하고 교차를 사용하는 가정 오전
case class Foo(a:int, b:String)
val serializedRecord(x -> value1 ,"a" -> somebytes, "b" -> someotherbytes, z -> value2)
//expected Foo(somebytes, someotherbytes)
val caseClassObject = HBaseSerDe[Foo].deserialize(serializedRecord)
역 직렬화하지만 모든 예제에서 나는 다음과 같은 것을 사용할 수있다. (github.com/underscoreio/shapeless-guide에서 가져옴)
implicit def genericMigration[
A, B,
ARepr <: HList, BRepr <: HList,
Unaligned <: HList
](
implicit
aGen : LabelledGeneric.Aux[A, ARepr],
bGen : LabelledGeneric.Aux[B, BRepr],
inter : hlist.Intersection.Aux[ARepr, BRepr, Unaligned],
align : hlist.Align[Unaligned, BRepr]
): Migration[A, B] = new Migration[A, B] {
def apply(a: A): B =
bGen.from(align.apply(inter.apply(aGen.to(a))))
}
그러나 CaseClass A가 없으므로 즉시 표현을 작성하는 방법을 알 수 없습니다. 아래에서 현재 코드를 찾을 수 있습니다 :
implicit val hNilEncoder = instance[HNil](
r => Map(),
l => HNil
)
implicit def hListSerDe[
Key <: Symbol,
H,
T <: HList
](
implicit
key: Witness.Aux[Key],
headSerDe: HBaseFieldShapelessSerDe[H],
tailSerDe: HBaseRecordShapelessSerDe[T]
): HBaseRecordShapelessSerDe[FieldType[Key, H] :: T] =
instance[FieldType[Key, H] :: T](
hList => {
Map(key.value.name -> headSerDe.serialize(hList.head)) ++ tailSerDe.serialize(hList.tail)
},
byteList => {
field[Key](headSerDe.deSerialize(byteList.head._2)) :: tailSerDe.deSerialize(byteList.tail)
}
)
implicit def caseClassSerDe[
TargetType,
L <: HList
](
implicit
genRepr: LabelledGeneric.Aux[TargetType, L],
hListSerDe: HBaseRecordShapelessSerDe[L]
): HBaseRecordShapelessSerDe[TargetType] =
instance[TargetType](
hList => {
hListSerDe.serialize(genRepr.to(hList))
},
byteList => {
genRepr.from(hListSerDe.deSerialize(byteList))
}
)
def apply[RecordSerDeType](implicit serde: HBaseRecordShapelessSerDe[RecordSerDeType]): HBaseRecordShapelessSerDe[RecordSerDeType] = serde
def instance[RecordSerDeType](serializeFunc: RecordSerDeType => Map[String, Array[Byte]], deserializeFunc: Map[String, Array[Byte]] => RecordSerDeType): HBaseRecordShapelessSerDe[RecordSerDeType] = {
new HBaseRecordShapelessSerDe[RecordSerDeType] {
override def serialize(value: RecordSerDeType): Map[String, Array[Byte]] = serializeFunc(value)
override def deSerialize(value: Map[String, Array[Byte]]): RecordSerDeType = deserializeFunc(value)
}
}