Şu anda XML-RPC iletilerine serileştirmek ve serileştirmek için bir kitaplık uyguluyorum. Neredeyse bitti ama şimdi şekilsiz kullanarak benim şimdiki asProduct yöntemin klişe çıkarmak için çalışıyorum. Benim geçerli kod:Öznitelikler ve tipler ile şekilsiz vaka sınıfları nasıl?
trait Serializer[T] {
def serialize(value: T): NodeSeq
}
trait Deserializer[T] {
type Deserialized[T] = Validation[AnyErrors, T]
type AnyErrors = NonEmptyList[AnyError]
def deserialize(from: NodeSeq): Deserialized[T]
}
trait Datatype[T] extends Serializer[T] with Deserializer[T]
// Example of asProduct, there are 20 more methods like this, from arity 1 to 22
def asProduct2[S, T1: Datatype, T2: Datatype](apply: (T1, T2) => S)(unapply: S => Product2[T1, T2]) = new Datatype[S] {
override def serialize(value: S): NodeSeq = {
val params = unapply(value)
val b = toXmlrpc(params._1) ++ toXmlrpc(params._2)
b.theSeq
}
// Using scalaz
override def deserialize(from: NodeSeq): Deserialized[S] = (
fromXmlrpc[T1](from(0)) |@| fromXmlrpc[T2](from(1))
) {apply}
}
Amacım kütüphanenin kullanıcı Demirbaş kodu yazmaya zorlamak olmadan/serisi kaldırılmaya vaka sınıfları seri hale getirmek için olanak sağlamaktır. Şu anda, bağlamda bir Datatype örneğinin olması için yukarıda belirtilen asProduct yöntemini kullanarak vaka sınıfını ve örtülü bir değeri bildirmeniz gerekir. Bu örtük aşağıdaki kodda kullanılır:
def toXmlrpc[T](datatype: T)(implicit serializer: Serializer[T]): NodeSeq =
serializer.serialize(datatype)
def fromXmlrpc[T](value: NodeSeq)(implicit deserializer: Deserializer[T]): Deserialized[T] =
deserializer.deserialize(value)
Bu seri ve tip sınıfları kullanarak deserializing klasik stratejisidir. Bu anda
, ben Jenerik veya LabelledGeneric aracılığıyla hList dava sınıflardan dönüştürmek için nasıl kavramışlardır. Bu dönüşüm ben asProduct2 örnekte olduğu gibi yöntemleri fromXmlrpc ve toXmlrpc çağırabilir nasıl yapmış kez sorundur. Bu nedenle, derleyici toXmlrpc fromXmlrpc ve tatmin herhangi örtük bulamıyorum durumda sınıfında niteliklerin türleri ve, hakkında herhangi bir bilgi yoktur. Bir HList öğesinin tüm öğelerinin bağlamda örtülü bir Datatype olduğunu kısıtlamak için bir yönteme ihtiyacım var. Biçimsiz bir acemi olduğum, ben bu işlevi almanın en iyi yolu ne olduğunu bilmek istiyorum. Bazı içgörülerim var ama kesinlikle Shapeless kullanarak nasıl yapılacağına dair hiçbir fikrim yok. İdeal durumda sınıfın belirli bir özelliğinin gelen türünü almak ve fromXmlrpc ve toXmlrpc için açıkça bu tür geçmesi için bir yol olacaktır. Bunun nasıl yapılacağını hayal ediyorum.