繁体   English   中英

如何将对象集合写入文件?

[英]How can I write a collection of objects to file?

我正在尝试收集电影并将其保存到文件中。 一切正常,直到我打开文本文件并得到以下信息:

“¬sr?java.util.ArrayListxÒ™ÇaI sizexp w sr?tema3ex1.movi​​e}ÆöôQ¹ªI idI ratingL categoryt Ljava / lang / String; L nameq〜L?releaseDateq〜xpýtSci-Fit Inceptiont 2010年7月30日x”

我进行了很多搜索,没有找到使它工作的方法。我还得到“此可序列化的类未声明静态最终”。 你们能帮我吗?

    public class movie implements Serializable {

private String name;
private String category;
private String releaseDate;
private int rating;
private int id;

 public movie(String name, String category, String releaseDate, int rating, int id){
     this.name=name;
     this.category=category;
     this.releaseDate=releaseDate;
     this.rating=rating;
     this.id=id;

 }

 public void add(List<movie> list, movie A){
     list.add(A);       
}


public void delete(List<movie> list, movie A){
    list.remove(A);
}

public void save(List<movie> list) throws IOException{
    try {
        FileOutputStream fout = new FileOutputStream("tmp.txt");
        ObjectOutputStream out = new ObjectOutputStream(fout);
        out.writeObject(list);
        out.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) throws IOException{  
    movie A = new movie("Inception", "Sci-Fi", " 30 July 2010", 8, 1375666);
    List<movie> list = new ArrayList<movie>();
    A.add(list, A);
    A.save(list);

}

我认为您想要一个具有人类可读文本的文件。 为了实现这一点,您不能使用Java序列化。 您需要选择一种格式(例如csv,xml,Json或其他格式),并获取一个序列化库来执行此操作。 为此,您可以使用Java编写程序,该程序可以读取该文件并将其转换为对象(解析文件)。 您可以使用Jackson CSV。

“ 2010年7月30日科幻小说“ X的java.util.ArrayListxÒ™ÇaI大小xp与tema3ex1.movi​​e}ÆöôQ¹ªI IDI等级L类别Ljava / lang / String; L名称q〜L releaseDateq〜xpýt

之所以得到这种输出,是因为您正在序列化对象。 如果要以可读格式将ArrayList的内容保存到文件中,则需要使用writer API类之一(例如FileWriter)写入内容。

而且我还得到“此可序列化的类未声明静态最终值

这是警告而不是编译错误。 向类添加静态serialVersionUID的目的是提供一种方法,以确保该类在序列化和反序列化之间不会发生变化。 想象一下,您序列化了一个具有2个字段的类。 您运行您的应用程序,它将序列化您的对象。 现在,您决定再向该类添加一个字段。 您运行您的应用程序,它将反序列化您的序列化对象。 JVM如何知道您的类已更改? 没错,它将序列化对象的serialVersionUID与类类型的serialVersionUID进行比较。 如果发现ID不匹配,则会引发异常。 这样做的含义是,每当更改可序列化的类时,都应确保更改serialVersionUID字段的值,以防止应用程序遇到无法理解的问题。

请注意,虽然静态字段未序列化,但serialVersionUID是一个特殊的标识符,其值被写入输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM