Java中泛型类型序列化的HashMap的HashMap

Java中泛型类型序列化的HashMap的HashMap,java,generics,serialization,hashmap,serializable,Java,Generics,Serialization,Hashmap,Serializable,根据工程师Dollery的回答,修复了底部的解决方案 目标是序列化类network的network字段。很抱歉给你起了个名字 我有这个,它被正确地编译和序列化了 public class Network { private HashMap<String, HashMap<String, Number>> network; ... public void load(String networkFile) throws Exception{

根据工程师Dollery的回答,修复了底部的解决方案

目标是序列化类network的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 {
    ...
}
每个请求,一个示例测试和错误。如您所见,它产生与上面相同的异常。我已经更新了测试,以表明如果没有向映射中添加任何内容,它将通过,否则将失败

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)
publicstaticvoidmain(字符串[]args)引发异常{
网络stringtest=新网络(“,”,“);
stringtest.save(“testempty”);
stringtest.load(“testempty”);
System.out.println(“传递为空”);
stringtest.placeAndMove(“填充”,0.0);
stringtest.save(“testfilled”);
stringtest.load(“testfilled”);
系统输出打印项次(“通过填写”);
}
java:b/Network/Network
空的
线程“main”java.io.NotSerializableException中的异常:Bullib.Network.Netw
劳动
位于java.io.ObjectOutputStream.WriteObject 0(未知源)
位于java.io.ObjectOutputStream.defaultWriteFields(未知源)
位于java.io.ObjectOutputStream.writeSerialData(未知源)
位于java.io.ObjectOutputStream.writeOrdinaryObject(未知源)
位于java.io.ObjectOutputStream.WriteObject 0(未知源)
位于java.io.ObjectOutputStream.writeObject(未知源)
位于java.util.HashMap.writeObject(未知源)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于java.io.ObjectStreamClass.invokeWriteObject(未知源)
位于java.io.ObjectOutputStream.writeSerialData(未知源)
位于java.io.ObjectOutputStream.writeOrdinaryObject(未知源)
位于java.io.ObjectOutputStream.WriteObject 0(未知源)
位于java.io.ObjectOutputStream.writeObject(未知源)
位于java.util.HashMap.writeObject(未知源)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于java.io.ObjectStreamClass.invokeWriteObject(未知源)
位于java.io.ObjectOutputStream.writeSerialData(未知源)
位于java.io.ObjectOutputStream.writeOrdinaryObject(未知源)
位于java.io.ObjectOutputStream.WriteObject 0(未知源)
位于java.io.ObjectOutputStream.writeObject(未知源)
在Bullib.Utility.serialize(Utility.java:21)
在Bullib.Network.Network.save(Network.java:88)
位于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 {
    ...
}
公共类网络{
专用HashMap网络;
...
公共无效加载(字符串networkFile)引发异常{
network=(HashMap)Utility.deserialize(Utility.load(networkFile));
}
public void save(字符串networkFile)引发异常{
save(networkFile,Utility.serialize(network));
}
}
类编号实现可序列化{
...
}

公共类网络实现可序列化{
专用HashMap网络;
...
公共无效加载(字符串networkFile)引发异常{
network=(HashMap)Utility.deserialize(Utility.load(networkFile));
}
public void save(字符串networkFile)引发异常{
save(networkFile,Utility.serialize(network));
}
}
类编号实现可序列化{
...
}
试试这个:

public class Network implements Serializable

您删除了错误中最重要的一行。
网络
类本身是否可序列化?另外,您没有复制堆栈跟踪的最上面一行。很抱歉,让我澄清一下所有这些内容
notserializableeexception
告诉您要序列化的非序列化类是什么。在错误消息中,它告诉您,
Bullib.Network.Network
是导致异常的不可序列化类,这意味着这里的问题似乎是您的
Network
类本身,而不是其中包含的hashmap。你的
网络
类需要实现
可序列化
。从我看来,没有什么错。当运行时存在不可序列化的对象时,将引发
NotSerializableException
。你现在用什么来代替
字符串
?试试
String
,它会工作的。然后确保无论你在那里填充什么,都没有一个不可细分的字段。和往常一样,一步一步地调试这个过程可能会向您揭示问题。感谢您指出错误——这就是我在编辑框中编码得到的结果。网络字段已完全可序列化,错误消息指的是网络类,而不是网络字段。我假设b.Network.Network是package.package.class。如果您删除您给出的答案中的-1,那就太好了。谢谢。@Aman如果您真的需要,您可以重写readObject和writeObject,只处理一个字段,而不是整个类。或者,您可以将所有其他字段标记为可传递。您的意思是“transient”。iPad又来袭了?对不起,是精神障碍而不是拼写检查。我刚刚回答了一个关于可传递依赖关系的问题,这个问题突然出现在我的脑海中,而不是暂时的!谢谢
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