java - 如何在 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();
}
}
}
解决方案
您在代码中所做的只是读取文件并解析它。
如果要对对象进行序列化和二次序列化,可以使用以下代码完成:
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();
}
推荐阅读
- hyperledger-fabric - Hyperledger Fabric 网络/应用程序的硬件大小调整
- mainframe - JCL - SORTIN 动态添加
- html - iPhone上的输入焦点问题
- css - 为什么 text-center 与 bootstrap 4 中的 text-right 相比具有更高的优先级
- google-bigquery - 使现有的 bigquery 表聚集在一起
- java - “[http-bio-8080-exec-494] [ERROR]”中exec之后的数字是什么意思?
- angular - Add plus sign "+" before input value in Angular2
- php - 字符编码问题 PHP & MySQLi
- firebase - 未获得从 Playstore 下载应用程序的用户的 Firebase 动态链接
- jenkins-x - 为什么 jx install 运行 chrome 来获取管理员令牌?