My Gradle项目包含Java和Groovy类。所有源都在src / main / groovy下。我的一个Groovy类包含一个我通过SIGKILL
读取JSON字符串创建的Map。该类标记为Serializable。
为避免NotSerializableException,我实现了自己的JsonSlurper.parseText()
和writeObject()
方法,但我的代码没有编译。我没有找到很多Groovy示例,但各种Java references和tutorials告诉我使用这些签名:
readObject()
我的班级看起来像这样:
private void writeObject(java.io.ObjectOutputStream out)
throws IOException
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException
编译错误:
import groovy.json.JsonBuilder
import groovy.json.JsonSlurper
class GroovyJSONMap implements Serializable {
private static final long serialVersionUID = 20150902L
Map myJSON = [:]
GroovyJSONMap() {
//no op
}
GroovyJSONMap(String json) {
if (json) {
try {
setJSON(json)
} catch (any) {
println "WHOOPS! Not a JSON object...."
myJSON = ["invalid": true]
}
}
}
GroovyJSONMap(Map json) {
if (json) {
setJSON(json)
}
}
final void setJSON(String json) {
myJSON = new JsonSlurper().parseText(json)
}
String getJSON() {
new JsonBuilder(myJSON).toString()
}
@Override
String toString() {
getJSON()
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
setJSON((String)in.readObject())
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.writeObject(getJSON())
}
}
我已将:clean
:compileJava UP-TO-DATE
:compileGroovy
startup failed:
c:\path\to\src\main\groovy\GroovyJSONMap.groovy: 44: unexpected token: ObjectInputStream @ line 110, column 29.
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
^
1 error
:compileGroovy FAILED
方法移动到源中的各个位置,但它仍然没有编译。编译器不会抱怨readObject()
,只会抱怨writeObject()
。为什么我的代码没有编译?
答案 0 :(得分:4)
编译器指向ObjectOutputStream
,但问题实际上是in
。
单词in在Groovy中是reserved word,不能用于变量或方法名称。
解决方案是将in
重命名为任何非Groovy保留字,例如stream
(为了保持一致,也更改为writeObject()
):
private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
setJSON((String)stream.readObject())
}
private void writeObject(ObjectOutputStream stream) throws IOException {
stream.writeObject(getJSON())
}