Próbuję napisać niestandardową parę SPickler/Unpickler, aby obejść niektóre z obecnych ograniczeń procesu wytrawiania scala. Typ danych, który próbuję pobierać, to klasa przypadku, w której niektóre pola mają już własne instancje SPickler i Unpickler. Chciałbym użyć tych wystąpień w moim niestandardowym zbieraczu, ale nie wiem jak.Scala Pickling: Pisanie niestandardowego pickler/unpickler dla struktur zagnieżdżonych
Oto przykład tego, co mam na myśli:
// Here's a class for which I want a custom SPickler/Unpickler.
// One of its fields can already be pickled, so I'd like to reuse that logic.
case class MyClass[A: SPickler: Unpickler: FastTypeTag](myString: String, a: A)
// Here's my custom pickler.
class MyClassPickler[A: SPickler: Unpickler: FastTypeTag](
implicit val format: PickleFormat) extends SPickler[MyClass[A]] with Unpickler[MyClass[A]] {
override def pickle(
picklee: MyClass[A],
builder: PBuilder) {
builder.beginEntry(picklee)
// Here we save `myString` in some custom way.
builder.putField(
"mySpecialPickler",
b => b.hintTag(FastTypeTag.ScalaString).beginEntry(
picklee.myString).endEntry())
// Now we need to save `a`, which has an implicit SPickler.
// But how do we use it?
builder.endEntry()
}
override def unpickle(
tag: => FastTypeTag[_],
reader: PReader): MyClass[A] = {
reader.beginEntry()
// First we read the string.
val myString = reader.readField("mySpecialPickler").unpickle[String]
// Now we need to read `a`, which has an implicit Unpickler.
// But how do we use it?
val a: A = ???
reader.endEntry()
MyClass(myString, a)
}
}
będę naprawdę wdzięczny działający przykład. Dzięki!
to działa , ale istnieje dziwna asymetria: w 'pickle', pola są nazwane, jak w' builder.putField ("myString", ...) ', ale nie używamy tych nazw w' unpickle'. Czy te nazwy są opcjonalne, a jeśli tak, jak możemy ich uniknąć? – emchristiansen
Niektóre formaty piklowania, takie jak JSON, umieszczają nazwy pól w pikle. Nawet jeśli czasami są niewykorzystane, nie ma możliwości uniknięcia ich użycia. Jednak interfejs API wciąż się rozwija. –
Te rzeczy nie będą działać dla json, tylko dla plików binarnych. – Yar