繁体   English   中英

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

[英]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序列化为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 {
    ...
}

尝试这个:

public class Network implements Serializable

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM