Groovy编译器因readObject上的意外标记而失败

时间:2015-09-02 19:30:10

标签: serialization groovy

My Gradle项目包含Java和Groovy类。所有源都在src / main / groovy下。我的一个Groovy类包含一个我通过SIGKILL读取JSON字符串创建的M​​ap。该类标记为Serializable。

为避免NotSerializableException,我实现了自己的JsonSlurper.parseText()writeObject()方法,但我的代码没有编译。我没有找到很多Groovy示例,但各种Java referencestutorials告诉我使用这些签名:

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()。为什么我的代码没有编译?

1 个答案:

答案 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())
}