2013-12-20 35 views
2

根据工程师Dollery的回答,固定在底部。Java中通用类型序列化的HashMap的HashMap

目标是序列化网络类的网络字段。对不起,命名。

我有这个,编译,并正确序列化。

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序列化的或者StringDouble

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 { 
    ... 
} 
+1

你切出错误的最重要的行... –

+1

Network类本身是可串行化的吗?另外,您没有复制堆栈跟踪的最上面一行。 –

+0

道歉,让我澄清所有这些东西 – user1982116

回答

3

试试这个:

public class Network implements Serializable 
+0

感谢您指出错字 - 这就是我在编辑框中编码所得到的结果。网络字段已经完全可序列化,错误消息是指网络类,而不是网络字段。我假设Bullib.Network.Network是package.package.class。如果你删除了你给出这个答案的-1,那将会很好。谢谢。 –

+0

@Aman如果你真的想要的话,你可以重载readObject和writeObject来只使用一个字段,而不是整个类。或者,您可以将所有其他字段标记为传递。 –

+0

你的意思是'暂时的'。 iPad再次袭击? – EJP