java.io.StreamCorruptedException:无效类型代码:9D

java.io.StreamCorruptedException:无效类型代码:9D,java,Java,我正在尝试在我的Linux服务器上运行一个jar文件。在我的Windows桌面上,我可以使用以下命令很好地执行jar文件: java -Xss1000m -XX:-UseGCOverheadLimit -Xmx5048m -jar test.jar 但是,当我在Linux服务器上运行它时,会出现以下错误: java.io.StreamCorruptedException: invalid type code: 9D at java.io.ObjectInputStream.readOb

我正在尝试在我的Linux服务器上运行一个jar文件。在我的Windows桌面上,我可以使用以下命令很好地执行jar文件:

java -Xss1000m -XX:-UseGCOverheadLimit -Xmx5048m -jar test.jar
但是,当我在Linux服务器上运行它时,会出现以下错误:

java.io.StreamCorruptedException: invalid type code: 9D
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1988)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1912)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1795)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
    at com.test.test.Main.main(Main.java:41)
我的代码是:

public class Main {
public static void main(String[] args) throws Exception {
    String fromTextFile = "";
    String path = "";

    if (!SystemUtils.IS_OS_WINDOWS)
        path = "/var/www/tomcat/fetch/";

    fromTextFile = path + "resources/ac_geonames_country_all.txt";

    AhoCorasick tree = new AhoCorasick();

    ObjectInputStream ois;
    try {
        ois = new ObjectInputStream(new FileInputStream(fromTextFile));
        tree = (AhoCorasick) ois.readObject();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

我设法使它工作起来。我直接在Linux服务器上重新创建了这些文件。现在一切都很好。要么是文件传输过程中出现了问题。或者Java在Linux上以不同的方式序列化文件。我不知道


@谢谢你指出这一点。然后文件传输会弄乱文件。

序列化对象不会存储在文本文件中。所以不要给它一个
txt
名称结尾。否则,请确保您的文件传输程序不会使用程序选项将其视为文本文件。如果传输程序应用换行符和字符集编码转换,它们很可能会破坏你的文件。我已经测试过了。WinSCP设置为自动文件传输。我手动将ac_geonames_country_all.txt文件切换到二进制模式。文件大小已更改,但错误保持不变。您是如何创建文件的,以及您正在序列化的对象的定义是什么?这个问题似乎与主题无关,因为它是关于用户错误的。Java在Linux上对文件的序列化没有不同。