[英]HashMap of HashMap of Generic Type serialization in Java
根据Engineer Dollery的答案,固定在底部的解决方案。
目标是序列化类Network的网络字段。 抱歉,命名。
我有这个,可以编译并正确序列化。
public class Network {
private HashMap<String, HashMap<String, Number>> network;
...
public void load(String networkFile) throws Exception{
network = (HashMap<String, HashMap<String, Number>>)Utility.deserialize(Utility.load(networkFile));
}
public void save(String networkFile) throws Exception{
Utility.save(networkFile, Utility.serialize(network));
}
}
class Number implements Serializable {
...
}
我将其更改为可编译但不再序列化的通用版本。 我需要某种方式来指定T和Number的HashMap可序列化。
public class Network<T extends Serializable> {
private HashMap<T, HashMap<T, Number>> network;
...
public void load(String networkFile) throws Exception{
network = (HashMap<T, HashMap<T, Number>>)Utility.deserialize(Utility.load(networkFile));
}
public void save(String networkFile) throws Exception{
Utility.save(networkFile, Utility.serialize(network));
}
}
class Number implements Serializable {
...
}
这是序列化的代码
package Bullib;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class Utility{
public static Pattern phrasePattern = Pattern.compile("[^;:!.?]+");
public static Pattern wordPattern = Pattern.compile("['A-Za-z]+");
public static Object deserialize(byte[] serialized) throws Exception {
ByteArrayInputStream bi = new ByteArrayInputStream(serialized);
ObjectInputStream si = new ObjectInputStream(bi);
return si.readObject();
}
public static byte[] serialize(Object target) throws Exception {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream so = new ObjectOutputStream(bo);
so.writeObject(target);
so.flush();
return bo.toByteArray();
}
public static byte[] load(String filename) throws Exception {
RandomAccessFile file = new RandomAccessFile(new File(filename), "r");
byte[] b = new byte[(int)file.length()];
file.read(b);
file.close();
return b;
}
public static void save(String filename, byte[] value) throws Exception {
RandomAccessFile file = new RandomAccessFile(new File(filename), "rw");
file.write(value);
file.close();
}
public static Collection<String> executeRegex(Pattern pattern, String text){
LinkedList<String> matches = new LinkedList<String>();
Matcher m = pattern.matcher(text);
while (m.find()) {
matches.add(m.group(0));
}
return matches;
}
}
这是我尝试将T
序列化为String
或Double
时返回的错误
Exception in thread "main" java.io.NotSerializableException: Bullib.Network.Netw
ork
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Bullib.Utility.serialize(Utility.java:21)
at Bullib.Network.Network.save(Network.java:88)
at Engine.save(Engine.java:63)
at Engine.main(Engine.java:88)
根据请求,示例测试和错误。 如您所见,它产生与上述相同的异常。 我已经更新了测试,以表明如果未在地图上添加任何内容,则测试可以通过,否则将失败。
public static void main(String[] args) throws Exception{
Network<String> stringtest = new Network<String>("","","");
stringtest.save("testempty");
stringtest.load("testempty");
System.out.println("passed empty");
stringtest.placeAndMove("fill",0.0);
stringtest.save("testfilled");
stringtest.load("testfilled");
System.out.println("passed filled");
}
java: Bullib/Network/Network
passed empty
Exception in thread "main" java.io.NotSerializableException: Bullib.Network.Netw
ork
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.HashMap.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at Bullib.Utility.serialize(Utility.java:21)
at Bullib.Network.Network.save(Network.java:88)
at Bullib.Network.Network.main(Network.java:108)
解决方案是改变
public class Network<T extends Serializable> {
private HashMap<T, HashMap<T, Number>> network;
...
public void load(String networkFile) throws Exception{
network = (HashMap<T, HashMap<T, Number>>)Utility.deserialize(Utility.load(networkFile));
}
public void save(String networkFile) throws Exception{
Utility.save(networkFile, Utility.serialize(network));
}
}
class Number implements Serializable {
...
}
至
public class Network<T extends Serializable> implements Serializable {
private HashMap<T, HashMap<T, Number>> network;
...
public void load(String networkFile) throws Exception{
network = (HashMap<T, HashMap<T, Number>>)Utility.deserialize(Utility.load(networkFile));
}
public void save(String networkFile) throws Exception{
Utility.save(networkFile, Utility.serialize(network));
}
}
class Number implements Serializable {
...
}
尝试这个:
public class Network implements Serializable
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.