【问题标题】:How to serialize all ArrayList objects created in one method?如何序列化在一种方法中创建的所有 ArrayList 对象?
【发布时间】:2017-07-21 11:31:14
【问题描述】:

我一直在努力创建一个序列化方法来序列化我所有现有的对象。这就是我所做的:

我的班级:

public class Test implements Serializable{
    ArrayList<TheOtherClass> obj = new ArrayList<>();

    public static void main(String[] args) {
            Test test = new Test();
            test.addTest("This", "Is", "Some");
            test.addTest("Text", "As", "Example");
            test.saveAllArrays();
    }
// omitted code down here.
    public void addTest(String some, String random, String text) {
    obj.add(new TheOtherClass(some, random, text));
}
    public void saveTest(Object obj) throws IOException{
                ObjectOutputStream save = new ObjectOutputStream(new FileOutputStream("SaveFile.bin"));
                save.writeObject(obj);
    }

    public void saveAllArrays(){
        for(TheOtherClass all : obj){
            try {
                saveTest(all);
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
        }
    }

我的对象类:

    public class TheOtherClass implements Serializable{
            private String some;
            private String random;
            private String savedText;

Getter 和 setter 方法被省略。

【问题讨论】:

  • 这是真实代码中的其他内容,这只是一个示例,但感谢您的快速响应。
  • 您的addTest() 声明和实现在哪里?另外,您的问题需要解释您遇到的问题。仅仅“挣扎”并不能告诉我们太多......
  • saveAllArrays() 在哪里?而test test = new test(); 将不起作用,因为该类被称为Test。请只发布您尝试运行的实际代码,而不是一个到处都有问题的随机示例。另外,您应该告诉我们确切的问题是什么 - 错误?例外?输出错误?
  • 抱歉,我刚刚修复了它。希望现在一切都好。不幸的是,我不能把我的实际代码放上去,否则我的作品在上交时会被标记为抄袭。我遇到的问题是我不知道为什么它没有序列化。
  • @BhargavModi Object 不是 Java 中的保留字。

标签: java serialization arraylist


【解决方案1】:

这是一个完整的例子。希望它能让你感动。

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Test implements Serializable {

    private static final String FILE = "SaveFile.bin";

    private List<Item> itemList = new ArrayList<>();

    public class Item implements Serializable {
        private String first;
        private String second;
        private String last;
        public Item(String first, String second, String last) {
            this.first = first;
            this.second = second;
            this.last = last;
        }

        @Override
        public String toString() {
            return first + ", " + second + ", " + last;
        }
    }

    public static void main(String args[]) {
        Test test = new Test();
        if(args.length > 0) {
            try {
                test.loadItemList();
                System.out.println("loaded");
                test.printList();
            } catch (IOException | ClassNotFoundException e) {
                System.out.println(e.getMessage());
            }
        } else {
            test.addItem("1", "2", "done");
            test.addItem("Text", "As", "Example");
            try {
                test.saveItemList();
                System.out.println("saved");
                test.printList();
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }
    }

    private void printList() {
        itemList.forEach(System.out::println);
    }

    private void addItem(String first, String second, String last) {
        itemList.add(new Item(first, second, last));
    }

    private void loadItemList() throws IOException, ClassNotFoundException {
        InputStream inputStream = new FileInputStream(FILE);
        ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
        itemList = (List<Item>) objectInputStream.readObject();
    }

    private void saveItemList() throws IOException {
        OutputStream outputStream = new FileOutputStream(FILE);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
        objectOutputStream.writeObject(itemList);
    }
}

【讨论】:

  • 这对我有帮助,多亏了这个,我的代码可以正常工作,谢谢。
  • 不错。很高兴它有帮助。
【解决方案2】:

目前,您正在为每个序列化对象创建一个新文件,因此您会丢失除最后一个之外的所有文件。根本不需要序列化多个对象,也不需要遍历数组列表。直接保存就行了,也直接反序列化就好了。

【讨论】:

  • 你的意思是在addTest()方法中吗?
  • 您没有迭代 addTest() 方法中的任何内容。我不知道你为什么问。我指的是您正在迭代的地方:saveAllArrays() 方法,以及在任何代码中进行反序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
相关资源
最近更新 更多