我正在编写一些代码来序列化我开发的神经网络系统。这个系统有一个";数据库";它通过将每个基因的ID存储在带有GeneKey的HashMap中来跟踪神经网络的进化,GeneKey是一个记录,包含我们存储的基因之前的基因ID和之后的基因ID。
带有一些数据的HashMap如下所示:
existingNodes = {
GeneKey[a=0, b=3] = 4,
GeneKey[a=1, b=4] = 5
}
除了这个HashMap之外,系统中的所有东西都可以串行化,因为Json只能用数字和字符串作为键,而在我的HashMap中,我使用对象作为键。有没有一种简单的方法可以使用Gson将其序列化为json?
编辑:这就是HashMap的构造方式:
HashMap<GeneKey, Integer> existingNodes = new HashMap<>();
existingNodes.put(new GeneKey(0, 3), 4);
existingNodes.put(new GeneKey(1, 4), 5);
System.out.println("existingNodes = "+registry);
//existingNodes = {
// GeneKey[a=0, b=3] = 4,
// GeneKey[a=1, b=4] = 5
//}
这是GeneKey类:
public record GeneKey(int a, int b) {}
如果您能给出使用Gson序列化后得到的JSON字符串,那将非常有用。
但是,如果这解决了您的问题,请检查以下代码。
使用overriden hashCode和equals方法定义GenKey类为:
public class GeneKey {
private int a;
private int b;
public GeneKey(int a, int b) {
this.a = a;
this.b = b;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + a;
result = prime * result + b;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
GeneKey other = (GeneKey) obj;
if (a != other.a)
return false;
if (b != other.b)
return false;
return true;
}
@Override
public String toString() {
//return "GeneKey [a=" + a + ", b=" + b + "]";
// Updated for deserialization using Gson
Gson gson = new
GsonBuilder().serializeNulls().disableHtmlEscaping().create();
return gson.toJson(this);
}
}
现在尝试使用Gson:将GenKey作为密钥的HashMap转换为JSON字符串
HashMap<GeneKey, Integer> existingNodes = new HashMap<>();
existingNodes.put(new GeneKey(0, 3), 4);
existingNodes.put(new GeneKey(1, 4), 5);
Gson gson = new
GsonBuilder().serializeNulls().disableHtmlEscaping().create();
System.out.println(gson.toJson(existingNodes));
这是我在控制台中收到的输出:
{"{"a":0,"b":3}":4,"{"a":1,"b":4}":5}
如果需要,更新答案以添加反序列化逻辑:
//Say, we pass the serialized JSON as a payload to some REST API. We can deserialize the Key of the response as follows -
@PostMapping("/getJson")
public Map<GeneKey, Integer> getJson(@RequestBody Map<String, Integer> response) {
final Gson gson = new Gson();
Map<GeneKey, Integer> deserializedMap = new HashMap<GeneKey,
Integer>();
response.keySet().forEach( k -> {
GeneKey key = gson.fromJson(k, GeneKey.class);
deserializedMap.put(key, response.get(k));
});
System.out.println(deserializedMap);
return deserializedMap;
}
GsonBuilder#enableComplexMapKeySerialization
但是,现在映射由条目数组表示。
参见Gson序列化HashMap<教师,列表<学生>gt;