uPickle and ScalaJS: Serialisierung versiegelter Merkmale

8

Ich versuche, ein einfaches Uplink-Beispiel zu bekommen, und es scheint, dass ich hier etwas verpasse. Ich möchte das Beispiel ausprobieren, das auf der Readme-Seite für den Uplink

bereitgestellt wird %Vor%

Dann ist mein Code:

%Vor%

Ich bekomme nur den Fehler:

  

Das referenzierte Merkmal [[A]] hat keine Unterklassen. Das vielleicht   passieren aufgrund einer Beschränkung von scalac (SI-7046) angesichts der Eigenschaft ist   nicht im selben Paket. Wenn dies der Fall ist, kann die Hierarchie sein   definiert mit ganzzahligen Konstanten.

Ich habe zwei Fragen:

  • Wie kann ich überzeugen, dass das Merkmal im gleichen Paket ist? (Weil es ist.)
  • Oder wenn ich nicht kann: Wie kann ich die Hierarchie mit ganzzahligen Konstanten definieren?
Jean-Philippe Pellet 20.02.2015, 14:01
quelle

2 Antworten

8

Hatten Sie jemals das Syndrom, dass Sie mehrere Stunden mit einem solchen Problem verbringen können, und Sie lösen es Minuten nachdem Sie die StackOverflow-Frage gestellt haben?

Es stellt sich heraus, dass aufgrund von Compiler-spezifische Details , ein solches versiegeltes Merkmal kennt seine direkten Unterklassen erst nach dem Punkt in der Datei, in dem es definiert ist. Also, in diesem Fall hatte ich das Merkmal und seine Fälle definiert nach die Hauptmethode, wo Upickle seine Makroexpansion und Magie tun würde. An diesem Punkt wird es nicht über die Fälle der Eigenschaft wissen. Wenn die Hauptmethode nach der Definition des Merkmals und seiner Fälle in derselben Datei verschoben wird, funktioniert es.

    
Jean-Philippe Pellet 20.02.2015, 14:18
quelle
2

Ich habe diesen Fehler in einem Scala.js-Projekt festgestellt, wo ich eine versiegelte abstrakte Klasse zwischen Server und Client freigegeben habe.

Die Lösung bestand darin, den Typelevel-Compiler anstelle des standardmäßigen Lightbend-Compilers zu verwenden.

Das ist leicht gemacht:

  1. Fügen Sie dies in Ihre build.properties : sbt.version=0.13.13-M1 ein
  2. und das oben in deinem build.sbt : scalaOrganization in ThisBuild:= "org.typelevel"

Der Vollständigkeit halber kann ich diese Klasse jetzt zwischen Client und Server freigeben:

%Vor%     
Matthias Braun 11.09.2016 18:57
quelle