Ich bin die Umsetzung derzeit eine Bibliothek zur Serialisierung und nach und von XML-RPC-Nachrichten deserialisieren. Es ist fast fertig, aber jetzt versuche ich, die vorformulierten meiner aktuellen asProduct Methode Shapeless Verwendung zu entfernen. Mein aktueller Code:Wie formlose Fallklassen mit Attributen und Typklassen?
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}
}
Mein Ziel ist der Benutzer meiner Bibliothek zu ermöglichen/Klassen deserialize Fall ohne ihn vorformulierten Code zu schreiben zwingen zu serialisiert. Derzeit müssen Sie die Fallklasse und ein implizites val deklarieren, indem Sie die zuvor erwähnte asProduct-Methode verwenden, um eine Datatype-Instanz im Kontext zu haben. Diese implizite wird im folgenden Code verwendet:
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)
Dies ist die klassische Strategie der Serialisierung und Deserialisierung mit Typklassen.
In diesem Moment habe ich begriffen, wie von Fall Klassen hList über Generisches oder LabelledGeneric zu konvertieren. Das Problem ist, wenn ich diese Umwandlung getan haben, wie ich die Methoden aufrufen können fromXmlrpc und toXmlrpc wie im asProduct2 Beispiel. Ich habe keine Informationen über die Arten der Attribute in dem Fall, Klasse und daher kann der Compiler keine implizite finden, die fromXmlrpc und toXmlrpc erfüllen. Ich muß einen Weg zu beschränken, dass alle Elemente eines hList Datentyp in Zusammenhang einen impliziten haben.
Da ich einen Anfänger mit Shapeless bin, würde ich gerne wissen, was der beste Weg, um diese Funktionalität zu bekommen. Ich habe einige Einsichten, aber ich habe definitiv keine Ahnung, wie man es mit Shapeless machen kann. Das Ideal wäre, eine Art zu haben, den Typ von einem gegebenen Attribut der Fallklasse zu erhalten und diesen Typ explizit an von Xmlrpc und anXmlrpc zu übergeben. Ich stelle mir vor, dass dies nicht möglich ist.