Java 如何在scala中保存案例类列表

Java 如何在scala中保存案例类列表,java,scala,save,Java,Scala,Save,我有一个名为Rdv的案例类: case class Rdv( id: Option[Int], nom: String, prénom: String, sexe: Int, telPortable: String, telBureau: String, telPrivé: String, siteRDV: String, typeRDV: String, libelléRDV: String, numRDV: String, étape: Str

我有一个名为Rdv的案例类:

case class Rdv(
  id: Option[Int],
  nom: String,
  prénom: String,
  sexe: Int,
  telPortable: String,
  telBureau: String,
  telPrivé: String,
  siteRDV: String,
  typeRDV: String,
  libelléRDV: String,
  numRDV: String,
  étape: String,
  dateRDV: Long,
  heureRDVString: String,
  statut: String,
  orderId: String)
我想把这些元素的列表保存在磁盘上,以后再重新加载。 我尝试使用java类(ObjectOutputStream、fileOutputStream、objectInputStream、fileInputStream),但在检索步骤中出现错误:语句

val n2 = ois.readObject().asInstanceOf[List[Rdv]]
始终获取错误(classNotFound:Rdv),尽管在导入位置给出了正确的路径

您知道保存此类对象的解决方法吗? 请提供一小段代码

谢谢

奥利维尔

ps:我在使用Marshall类时出现了相同的错误,例如在以下代码中:

object Application extends Controller {

def index = Action {

//implicit val Rdv2Writes = Json.writes[rdv2]

def rdvTordv2(rdv: Rdv): rdv2 = new rdv2(
  rdv.nom,
  rdv.prénom,
  rdv.dateRDV,
  rdv.heureRDVString,
  rdv.telPortable,
  rdv.telBureau,
  rdv.telPrivé,
  rdv.siteRDV,
  rdv.typeRDV,
  rdv.libelléRDV,
  rdv.orderId,
  rdv.statut)




val n = variables.manager.liste_locale
val out = new FileOutputStream("out")
out.write(Marshal.dump(n))
out.close

val in = new FileInputStream("out")
val bytes = Stream.continually(in.read).takeWhile(-1 !=).map(_.toByte).toArray
val bar: List[Rdv] = Marshal.load[List[Rdv]](bytes)        <--------------

val n3 = bar.map(rdv =>
  rdvTordv2(rdv))
println("n3:" + n3.size)




Ok(views.html.Application.olivier2(n3))

}

},
object Test1 extends App {

//pour des fins de test
case class Person(name:String,age:Int)
val liste_locale=List(new Person("paul",18))

val n = liste_locale
val out = new FileOutputStream("out")
out.write(Marshal.dump(n))
out.close

val in = new FileInputStream("out")
val bytes = Stream.continually(in.read).takeWhile(-1 !=).map(_.toByte).toArray
val bar: List[Person] = Marshal.load[List[Person]](bytes)
println(s"bar:size=${bar.size}")
}
并且显示良好(“条:大小=1”)

然后,我在play项目中的controller类中修改了以前的代码,例如:

object Application extends Controller {

def index = Action {

//pour des fins de test
case class Person(name:String,age:Int)
val liste_locale=List(new Person("paul",18))

val n = liste_locale
val out = new FileOutputStream("out")
out.write(Marshal.dump(n))
out.close

val in = new FileInputStream("out")
val bytes = Stream.continually(in.read).takeWhile(-1 !=).map(_.toByte).toArray
val bar: List[Person] = Marshal.load[List[Person]](bytes)
println(s"bar:size=${bar.size}")


Ok(views.html.Application.olivier2(Nil))

}

}
import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

val appName = "sms_play_2"
val appVersion = "1.0-SNAPSHOT"

val appDependencies = Seq(
// Add your project dependencies here,
jdbc,
anorm,
"com.typesafe.slick" % "slick_2.10" % "2.0.0",
"com.github.nscala-time" %% "nscala-time" % "0.6.0",
"org.xerial" % "sqlite-jdbc" % "3.7.2",
"org.quartz-scheduler" % "quartz" % "2.2.1",
"com.esotericsoftware.kryo" % "kryo" % "2.22",
"io.argonaut" %% "argonaut" % "6.0.2")

val mySettings = Seq(
(javaOptions in run) ++= Seq("-Dconfig.file=conf/dev.conf"))

val playCommonSettings = Seq(

Keys.fork := true)

val main = play.Project(appName, appVersion, appDependencies).settings(

  Keys.fork in run := true,
resolvers += Resolver.sonatypeRepo("snapshots")).settings(mySettings: _*)
.settings(playCommonSettings: _*)

}
我有一个错误说:

play.api.Application$$anon$1: Execution exception[[ClassNotFoundException: controllers.Application$$anonfun$index$1$Person$3]]
有人知道答案吗

编辑:我认为错误可能来自sbt,所以我修改build.scala如下:

object Application extends Controller {

def index = Action {

//pour des fins de test
case class Person(name:String,age:Int)
val liste_locale=List(new Person("paul",18))

val n = liste_locale
val out = new FileOutputStream("out")
out.write(Marshal.dump(n))
out.close

val in = new FileInputStream("out")
val bytes = Stream.continually(in.read).takeWhile(-1 !=).map(_.toByte).toArray
val bar: List[Person] = Marshal.load[List[Person]](bytes)
println(s"bar:size=${bar.size}")


Ok(views.html.Application.olivier2(Nil))

}

}
import sbt._
import Keys._
import play.Project._

object ApplicationBuild extends Build {

val appName = "sms_play_2"
val appVersion = "1.0-SNAPSHOT"

val appDependencies = Seq(
// Add your project dependencies here,
jdbc,
anorm,
"com.typesafe.slick" % "slick_2.10" % "2.0.0",
"com.github.nscala-time" %% "nscala-time" % "0.6.0",
"org.xerial" % "sqlite-jdbc" % "3.7.2",
"org.quartz-scheduler" % "quartz" % "2.2.1",
"com.esotericsoftware.kryo" % "kryo" % "2.22",
"io.argonaut" %% "argonaut" % "6.0.2")

val mySettings = Seq(
(javaOptions in run) ++= Seq("-Dconfig.file=conf/dev.conf"))

val playCommonSettings = Seq(

Keys.fork := true)

val main = play.Project(appName, appVersion, appDependencies).settings(

  Keys.fork in run := true,
resolvers += Resolver.sonatypeRepo("snapshots")).settings(mySettings: _*)
.settings(playCommonSettings: _*)

}
但是没有成功,错误仍然存在(找不到类人)


您能帮助我吗?

有合理的动力,而且这种方法有很多优点(很多繁重的工作是在编译时完成的)。有一种可插入的序列化机制,支持json等格式。

您可以序列化为json等可解析的非二进制格式,这通常是一个更好的选择(并非总是)。我不相信“给出了正确的路径”。路径必须包含您正在反序列化的类。@som snytt:I有,在导入metier.Objets.Rdv的版本中!!!帮助我的意思是“运行时类路径”,而不是完全限定的名称。好的,但是我怎样才能在eclipse中更改它呢?我很快地搜索了一下,但没有找到任何有用的东西