java - recorre - HashMap no se puede serializar
map and hashmap in java (2)
Se supone que HashMap
con la clave / valor Serializable
es Serializable
.
Pero no está funcionando para mí. Intenté algunas otras transmisiones de IO. Ninguna funciona
¿Cualquier sugerencia?
Código de prueba
public class SimpleSerializationTest {
@Test
public void testHashMap() throws Exception {
HashMap<String, String> hmap = new HashMap<String, String>() {{
put(new String("key"), new String("value"));
}};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
out = new ObjectOutputStream(bos);
out.writeObject(hmap);
byte[] yourBytes = bos.toByteArray();
if (out != null) {
out.close();
}
bos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
in = new ObjectInputStream(bis);
Object o = in.readObject();
bis.close();
if (in != null) {
in.close();
}
assertEquals(hmap, o);
}
}
Seguimiento de pila
java.io.NotSerializableException: SimpleSerializationTest
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at SimpleSerializationTest.testHashMap(SimpleSerializationTest.java:18)
Process finished with exit code 0
El mensaje de excepción le dice exactamente cuál es el problema: está tratando de serializar una instancia de la clase SimpleSerializationTest
, y esa clase no es serializable.
¿Por qué? Bien, ha creado una clase interna anónima de SimpleSerializationTest
, una que amplía HashMap
, y está intentando serializar una instancia de esa clase. Las clases internas siempre tienen referencias a la instancia relevante de su clase externa, y de manera predeterminada, la serialización intentará atravesarlas.
Observo que usa una sintaxis de doble corchete {{ ... }}
como si pensara que tiene algún tipo de significado especial. Es importante entender que en realidad son dos constructos separados. El par de llaves externas que aparecen inmediatamente después de una invocación de constructor marca los límites de la definición de clase interna. El par interno enlazó un bloque de inicializador de instancia, como puede usar en cualquier cuerpo de clase (aunque son inusuales en contextos que no sean clases internas anónimas). Normalmente, también incluiría una o más implementaciones / anulaciones de métodos dentro del par externo, ya sea antes o después del bloque de inicialización.
Pruebe esto en su lugar:
public void testHashMap() throws Exception {
HashMap<String, String> hmap = new HashMap<String, String>();
hmap.put(new String("key"), new String("value"));
// ...
}
Una versión de trabajo de tu código:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import org.junit.Test;
import junit.framework.Assert;
public class SimpleSerializationTest implements Serializable{
@Test
public void testHashMap() throws Exception {
HashMap<String, String> hmap = new HashMap<String, String>() {{
put(new String("key"), new String("value"));
}};
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
out = new ObjectOutputStream(bos);
out.writeObject(hmap);
byte[] yourBytes = bos.toByteArray();
if (out != null) {
out.close();
}
bos.close();
ByteArrayInputStream bis = new ByteArrayInputStream(yourBytes);
ObjectInput in = null;
in = new ObjectInputStream(bis);
HashMap<String, String> o = (HashMap<String, String>) in.readObject();
bis.close();
if (in != null) {
in.close();
}
Assert.assertEquals(hmap, o);
}
}