首页 > 解决方案 > 如何在 Java 中序列化和反序列化对象?

问题描述

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

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

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

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

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

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();
    }

  }
} 

标签: javaarraylistserializationhashmap

解决方案


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

如果要对对象进行序列化和二次序列化,可以使用以下代码完成:

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();
 }

推荐阅读