2013-12-20 4 views
2

Исправлено, на ответ инженера Доллары, решение внизу.HashMap HashMap сериализации типового типа в Java

Целью является сериализация сетевого поля класса 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 { 
    ... 
} 

Я поменял его на эту общую версию, которая компилируется, но больше не сериализуется. Мне нужно каким-то образом указать, что HashMap из T и Number сериализуем.

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) 

Per запросов, пример теста и ошибки. Как вы можете видеть, оно дает то же исключение, что и выше. Я обновил тест, чтобы показать, что он проходит, если на карту ничего не добавлено, а в противном случае - нет.

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

Является ли сам класс «Сети» сериализуемым? Кроме того, вы не копировали самую верхнюю строку трассировки стека. –

+0

Извинения, позвольте мне прояснить все это. – user1982116

ответ

3

Попробуйте это:

public class Network implements Serializable 
+0

спасибо за указание опечатки - вот что я получаю для кодирования в окне редактирования. сетевое поле уже полностью сериализуется, сообщение об ошибке относится к классу Network, а не к сетевому полю. Я предполагаю, что Bullib.Network.Network - package.package.class. Было бы неплохо, если бы вы удалили -1, вы дали этот ответ. Благодарю. –

+0

@Aman Вы можете переопределить readObject и writeObject для работы только с одним полем, а не со всем классом, если вы действительно этого хотели. Или вы могли бы отметить все остальные поля как транзитивные. –

+0

Вы имеете в виду «переходный». iPad снова наносит удар? – EJP

Смежные вопросы