【问题标题】:TreeMap Map.Entry NotSerializableException in JavaJava 中的 TreeMap Map.Entry NotSerializableException
【发布时间】:2018-08-23 16:00:06
【问题描述】:

我正在尝试将 TreeMap 序列化为文本文件,但无法使其工作。我尝试过打印/调试和阅读 Javadocs。

我的 Record 和 Table 类都实现了可序列化,我还构建了一个自定义比较器,它也为我的新 TreeMap() 实现了可序列化。

我相信我已将问题范围缩小到:

  • 我正在尝试序列化 Map.Entry,它可能无法序列化,因此出现 NotSerializableExceptions。
  • TreeMap 是/不可序列化的 (?)。
  • (Unknown Source) - 不确定 Unknown Source 对我的 writeObject java.io.ObjectInputStream.readObject0(Unknown Source) 做了什么和 java.io.ObjectInputStream.writeObject0(未知来源)

我的主要目标是通过在 writeObject() 时正确序列化 Map.Entry 或 TreeMap 来消除 NotSerializableExceptions。

第二个问题是“readObject0(Unknown Source)”是什么。在其他类似于我的问题的情况下,有一个 ObjectOutputStream:1356 我的来源未知。

我目前使用的是 Java 8。

类 Record 实现 Serializable{

private String[] row;

类表实现可序列化{

private TreeMap<String, Record> tm = new TreeMap<>(
        new ReverseNaturalOrderComparator());

private String[] columns;
private int totalRecords;
[...]
[...]
[...]
void insertRecord( String key, Record r ) { 
    if( r.rowArrayLength() == numRowFields ) {
        tm.put(key, r); 
        totalRecords++;
    }
    else { 
        System.out.println("Number of fields do not match. " + 
        "Please enter a record with " + numRowFields + " fields");
    }
}

类文件{

File file = new File("KeyValues.txt");

void writeFile(Table t) throws IOException {

    TreeMap<String, Record> ftm = t.getTreeMap();
    FileOutputStream os = new FileOutputStream(file);       
    ObjectOutputStream oos = new ObjectOutputStream(os);

    Set set = ftm.entrySet();
    Iterator i = set.iterator();
    while(i.hasNext()) {

        Map.Entry<String, Record> keyValue = (Map.Entry<String, Record>)i.next();

        if( !file.exists() ) { System.out.println("No such file exists"); }
        else { oos.writeObject(keyValue); } // <---causing error
    }
    oos.close();
    os.close();

}

类 Files 中的以下代码块导致错误: 迭代器 i = set.iterator(); while(i.hasNext()) {

    Map.Entry<String, Record> keyValue = (Map.Entry<String, Record>)i.next();

    if( !file.exists() ) { System.out.println("No such file exists"); }
    else { oos.writeObject(keyValue); } // <---causing error
}
oos.close();
os.close();

} 主要():

public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
    Table t = new Table();

    Record test0 = new Record("We are the champions, my friend.");
    Record test1 = new Record("hope this works, but might not");
    Record test2 = new Record("sweet, yellow bananas");
    Record test3 = new Record("and bad mistakes Ihave made afew");
    Record test4 = new Record("Now using and printing a TreeMap<>");
    Record test5 = new Record("Exploring Antarctica alongside the polar bears");    

    t.insertRecord("3",test3);
    t.insertRecord("0",test0);
    t.insertRecord("2",test2);
    t.insertRecord("4",test4);
    t.insertRecord("1",test1);
    t.insertRecord("5",test5);

    try { writeFile(t); } //this is giving me the error.

错误日志

java.io.NotSerializableException: java.util.TreeMap$Entry
Final filepath : ...KeyValues.txt
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at Files.writeFile(Files.java:52)
    at Files.test(Files.java:87)
    at Files.run(Files.java:64)
    at Files.main(Files.java:62)
java.io.WriteAbortedException: writing aborted; 
java.io.NotSerializableException: java.util.TreeMap$Entry
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at Table.readFile(Table.java:92)
    at Files.test(Files.java:100)
    at Files.run(Files.java:64)
    at Files.main(Files.java:62)
Caused by: java.io.NotSerializableException: java.util.TreeMap$Entry
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at Files.writeFile(Files.java:33)
    at Files.test(Files.java:66)
    at Files.run(Files.java:48)
    at Files.main(Files.java:46)

【问题讨论】:

  • 你能指出哪一行是Files.java的第33行吗?
  • stackoverflow.com/questions/13895867/… 这与您要解决的问题有关吗?你有writeObject(entry)吗?
  • @ShioT 第 33 行:oos.writeObject(keyValue);
  • 我相当有信心我的问题出在 Files.java:30-33 while(i.hasNext()) { Map.Entry keyValue = (Map.Entry)i.next(); if ( !file.exists() ) { System.out.println("不存在这样的文件"); } 其他 { oos.writeObject(keyValue); }
  • 要确定 TreeMap 是否可序列化,请转到 the documentation 并阅读页面顶部下方几行的所有已实现接口部分。

标签: java serialization treemap objectoutputstream


【解决方案1】:

如果您希望序列化的类包含对象的引用,则描述这些对象的类也应该实现 Serializable(在这种情况下为 Record 类)。

编辑:您也可以尝试将File file = new File("KeyValues.txt"); 更改为String file = "KeyValues.txt";

【讨论】:

  • 嗨,正如我在帖子中所写,我确实在所有类中实现了这一点,并且我还尝试使用 Serializable 实现我自己的新比较器。
猜你喜欢
  • 2011-11-16
  • 2023-04-03
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多