gpt4 book ai didi

java - 导入和反序列化时对象显示 null

转载 作者:行者123 更新时间:2023-12-02 10:57:14 25 4
gpt4 key购买 nike

目前正在通过HashMap<byte[],byte[]>其中两个值都在 TMap 中预先序列化,可见于 FILEPATH ,当程序运行时,显示键和值。我尝试将其更改为非静态字段,但可惜的是,在加载 TMap 时在对象的构造函数上 Map持有null 。这是用于保存和加载 TMap 的代码。有人有什么建议吗?

public void loadTMap() {
HashMap<byte[], byte[]> TMap = new HashMap<>();
File f = new File("FILEPATH);
if(f.exists()) {
try {
FileInputStream fileIn = new FileInputStream("FILEPATH");
ObjectInputStream in = new ObjectInputStream(fileIn);
TMap = (HashMap<byte[], byte[]>) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
} catch (ClassNotFoundException c) {
}
}
}

public void saveTMap(HashMap<byte[], byte[]> TMap) {
try {
FileOutputStream fileOut = new FileOutputStream(FILEPATH);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(TMap);
out.close();
fileOut.close();
} catch (IOException i) {
i.printStackTrace();
}
}

最佳答案

在您的代码中,TMap 已正确写入和读取。问题是您不能使用字节数组作为映射的键,因为 equals 比较字节数组的引用而不是内容。

将您的 key 包装在自定义类中并实现 equalshashCode,如下所示:

public class ByteArrayKey implements Serializable {

private byte[] content;

public ByteArrayKey(byte[] content) {
this.content = content;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ByteArrayKey that = (ByteArrayKey) o;
return Arrays.equals(content, that.content);
}

@Override
public int hashCode() {
return Arrays.hashCode(content);
}
}

然后更改加载和保存方法,如下所示:

public static HashMap<ByteArrayKey, byte[]> loadTMap() {
HashMap<ByteArrayKey, byte[]> TMap = new HashMap<>();
File f = new File(FILEPATH);
if (f.exists()) {
try {
FileInputStream fileIn = new FileInputStream(FILEPATH);
ObjectInputStream in = new ObjectInputStream(fileIn);
TMap = (HashMap<ByteArrayKey, byte[]>) in.readObject();
in.close();
fileIn.close();
} catch (IOException i) {
i.printStackTrace();
} catch (ClassNotFoundException c) {
c.printStackTrace();
}
}
return TMap;
}

public static void saveTMap(HashMap<ByteArrayKey, byte[]> TMap) {
try {
FileOutputStream fileOut = new FileOutputStream(FILEPATH);
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(TMap);
out.close();
fileOut.close();
} catch (IOException i) {
i.printStackTrace();
}
}

关于java - 导入和反序列化时对象显示 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com