【问题标题】:How can I translate this deserialization code from java to scala?如何将此反序列化代码从 java 转换为 scala?
【发布时间】:2012-12-10 13:00:12
【问题描述】:

我是 Scala/Java 菜鸟,很抱歉,如果这是一个相对简单的解决方案 - 但我正在尝试访问外部文件中的模型(Apache Open NLP 模型),但不确定我在哪里我出错了。 Here's how you'd do it in Java,这就是我正在尝试的:

import java.io._

val nlpModelPath = new java.io.File( "." ).getCanonicalPath + "/lib/models/en-sent.bin"
val modelIn: InputStream = new FileInputStream(nlpModelPath)

效果很好,但是尝试根据该二进制文件中的模型实例化对象是我失败的地方:

val sentenceModel = new modelIn.SentenceModel // type SentenceModel is not a member of java.io.InputStream
val sentenceModel = new modelIn("SentenceModel") // not found: type modelIn

我也尝试过 DataInputStream:

val file = new File(nlpModelPath)
val dis = new DataInputStream(file)
val sentenceModel = dis.SentenceModel() // value SentenceModel is not a member of java.io.DataInputStream

我不确定我缺少什么——也许是某种将 Stream 转换为可以从中提取方法的二进制对象的方法?感谢您的任何指点。

【问题讨论】:

  • 你为什么不像在java中那样做呢?例如val model = new SentenceModel(modelIn)?
  • 我应该提到我试过了,结果:not found: type SentenceModel
  • 在此之前,您必须在源文件顶部添加import opennlp.tools.sentdetect.SentenceModel(假设您的类路径中已经有 opennlp)。
  • 啊!太感谢了。那行得通。那么,你是怎么找到opennlp的包结构的呢?
  • 我在谷歌有looked up SentenceModel。第一个链接是javadoc,我在其中找到了this

标签: java scala deserialization


【解决方案1】:

问题是您使用了错误的语法(请不要将其视为个人内容,但是如果您打算坚持使用 java 或 scala有时间吗?)

你会用java编写的代码

SentenceModel model = new SentenceModel(modelIn);

在 scala 中看起来很相似:

val model: SentenceModel = new SentenceModel(modelIn)
// or just 
val model = new SentenceModel(modelIn)

您使用此语法遇到的问题是您忘记导入 SentenceModel 的定义,因此编译器根本不知道什么是 SentenceModel。

添加

import opennlp.tools.sentdetect.SentenceModel

在 .scala 文件的顶部,这将修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 2018-06-24
    • 2015-11-14
    • 2021-11-03
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    相关资源
    最近更新 更多