#serialization #scala #marshalling #unmarshalling #classnotfoundexception
#сериализация #scala #маршалирование #отмена сортировки #исключение classnotfoundexception
Вопрос:
Я пытаюсь сделать маршалл-дамп и загрузить в Scala…
import scala.util.Marshal
case class Test(test: String)
val t = Test("hello")
val bytes = Marshal.dump(t)
Marshal.load[Test](bytes)
…но вызов Marshal.загрузка вызывает исключение ClassNotFoundException…
java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:603)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
at java.io.ObjectInputStream.readClass(ObjectInputStream.java:1461)
at java.io.Ob...
Я также пытался использовать полное имя класса, но безуспешно. Чего я не понимаю?
Комментарии:
1. Ваш код отлично работает в Scala 2.8.1.
2. @Frank Для меня этого здесь нет — в Windows. Может быть, по какой-то причине это не работает в Windows? Если это так, возможно, запрос в порядке.
3. @Daniel Я тестировал это в Linux.
4. Я также тестировал код под Linux. Это работает, когда я компилирую код через scalac и запускаю его с помощью scala, но это не работает, когда я помещаю код непосредственно в интерпретатор. Вы использовали интерпретатор для тестирования, scttnlsn?
5. Даже когда я копирую и вставляю код в REPL, он работает так, как ожидалось.
Ответ №1:
Какую версию SBT вы используете? У меня были похожие проблемы с SBT 0.7.7, и я решил их, добавив в свою сборку следующее:
// cause the SBT "run" action to fork
override def fork = Some(new ForkScalaRun() {
override def scalaJars = Seq(buildLibraryJar.asFile, buildCompilerJar.asFile)
})
Похоже, что принудительное выполнение действия «run» устраняет проблемы с загрузчиком классов и проблемы с перехватом System.exit
вызовов:
http://code.google.com/p/simple-build-tool/wiki/Forking
http://code.google.com/p/simple-build-tool/wiki/RunningProjectCode
Комментарии:
1. для более новых версий sbt используйте
fork in run := true
в вашемbuild.sbt