【问题标题】:How to serialise and de-serialise an object in Java?如何在 Java 中序列化和反序列化对象?
【发布时间】:2021-04-22 10:45:17
【问题描述】:

我需要修改 PrimeFactors 类,使其扩展 HashMap 并实现 Serializable。

让 x 是一个数字,y 是一个包含 x 的质因数的 ArrayList:将所有 对添加到 PrimeFactors 并将对象序列化到一个新文件中。

然后编写一个方法,从文件中反序列化 PrimeFactors 对象并显示 对。

现在,我完全陷入困境,不知道如何继续。任何帮助将不胜感激,因为我对这种情况非常不熟悉。

到目前为止,这是我的代码:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
import java.io.Serializable;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.ObjectOutputStream;


public class PrimeFactors2 extends HashMap<Integer,ArrayList<Integer>> implements Serializable {

public static void findFactor(int n) {
    System.out.print("Factors for the number " + n + " is: ");
    for (int i = n; i >= 1; i--) {
        if (n % i == 0)
            System.out.print(i + " ");
    }
}

public static boolean checkForPrime(int number) {

    boolean isItPrime = true;

    if (number <= 1) {
        isItPrime = false;
        return isItPrime;
    } else {
        for (int i = 2; i <= number / 2; i++) {
            if ((number % i) == 0) {
                isItPrime = false;
                break;
            }
        }

        return isItPrime;
    }

}

public static void main(String[] args) {

    String path = "/Users/benharrington/Desktop/primeOrNot.csv";
    String line = "";

    try {
        BufferedReader br = new BufferedReader(new FileReader(path));
        ArrayList<Integer> list = new ArrayList<Integer>();

        while ((line = br.readLine()) != null) {
            String[] values = line.split(",");

            for (String str : values) {
                int i = Integer.parseInt(str);
                boolean isItPrime = checkForPrime(i);

                if (isItPrime)
                    System.out.println(i + " is Prime");
                else
                    System.out.println(i + " is not Prime");

                if (isItPrime == false) {
                    list.add(i);

                }

            }
            for (int k : list) {
                System.out.println(" ");
                findFactor(k);

            }

        }

    } catch (FileNotFoundException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }

  }
} 

【问题讨论】:

    标签: java arraylist serialization hashmap


    【解决方案1】:

    您在代码中所做的只是读取文件并解析它。

    如果你想对一个对象进行序列化和二次序列化,可以用下面的代码来完成:

    PrimeFactors2 primeFactors2 = // you object creation code here;
    // i.e:
    // PrimeFactors2 primeFactors2 = new PrimeFactors2();
    // primeFactors2.setX1(2);
    // primeFactors2.setX2(3);
    
    try {
         FileOutputStream fileOut = new FileOutputStream("/tmp/obj.ser");
         ObjectOutputStream out = new ObjectOutputStream(fileOut);
         out.writeObject(primeFactors2);
         out.close();
         fileOut.close();
     } catch (Exception e) {
         e.printStackTrace();
     }
    

    然后,在同一时刻(或在您创建 .ser 对象之后)的某些上下文(相同或另一个)中,您可以使用以下代码对其进行反序列化:

    try {
         FileInputStream fileIn = new FileInputStream("/tmp/obj.ser");
         ObjectInputStream in = new ObjectInputStream(fileIn);
         PrimeFactors2 primeFactors2 = (PrimeFactors2) in.readObject();
         // YAY!!! primeFactors2 is an object with the same values you created before
         // i.e: primeFactors.getX1() is 2
         // primeFactors.getX2() is 3
         in.close();
         fileIn.close();
     } catch (Exception e) {
         e.printStackTrace();
     }
    

    【讨论】:

    • 我会在 PrimeFactors2 primeFactors2 = 之后放置什么类型的代码
    • 根据您的逻辑创建您的对象...。我编辑了上面的代码作为例子。