2012-06-03 15 views
9

Supongamos que tengo una clase SerializableShapeHolder que posee un objeto que implementa una interfaz Serializable . Quiero asegurarme de que se guarda el objeto de forma concreta correcto (y luego se restaura el tipo correcto).¿Cómo puedo serializar una interfaz?

¿Cómo puedo lograr esto?

interface Shape extends Serializable {} 

class Circle implements Shape { 
    private static final long serialVersionUID = -1306760703066967345L; 
} 

class ShapeHolder implements Serializable { 
    private static final long serialVersionUID = 1952358793540268673L; 
    public Shape shape; 
} 

Respuesta

6

de Java Serializable hace esto de forma automática.

public class SerializeInterfaceExample { 

    interface Shape extends Serializable {} 
    static class Circle implements Shape { 
     private static final long serialVersionUID = -1306760703066967345L; 
    } 

    static class ShapeHolder implements Serializable { 
     private static final long serialVersionUID = 1952358793540268673L; 
     public Shape shape; 
    } 

    @Test public void canSerializeShape() 
     throws FileNotFoundException, IOException, ClassNotFoundException { 
     ShapeHolder circleHolder = new ShapeHolder(); 
     circleHolder.shape = new Circle(); 

     ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("test")); 
     out.writeObject(circleHolder); 
     out.close(); 

     ObjectInputStream in = new ObjectInputStream(new FileInputStream("test")); 
     final ShapeHolder restoredCircleHolder = (ShapeHolder) in.readObject(); 
     assertThat(restoredCircleHolder.shape, instanceOf(Circle.class)); 
     in.close(); 
    } 
} 
0
import java.io.*; 

public class ExampleSerializableClass implements Serializable { 
    private static final long serialVersionUID = 0L; 

    transient private Shape shape; 
    private String shapeClassName; 

    private void writeObject(ObjectOutputStream out) throws IOException { 
     shapeClassName = shape.getClass().getCanonicalName(); 
     out.defaultWriteObject(); 
    } 

    private void readObject(ObjectInputStream in) 
      throws IOException, ClassNotFoundException, 
       InstantiationException, IllegalAccessException { 
     in.defaultReadObject(); 
     Class<?> cls = Class.forName(shapeClassName); 
     shape = (Shape) cls.newInstance(); 
    } 
} 
+3

Alexeyy, termina que todo este trabajo se hace automáticamente cuando se agrega 'extends Serializale'. No me di cuenta de esto cuando escribí la pregunta. No estoy seguro de si ya sabía esto y estaba confundido por mi pregunta de novato. –

0

quiero para asegurarse de que el objeto forma concreta correcta se guarda (y el tipo correcto se restauró más adelante).

serialización por defecto de Java (ObjectInputStream & ObjectOutputStream) hace que fuera de la caja. Al serializar, Java escribe allí el nombre de la clase concreta y luego utiliza cuando deserializa.

+0

Gracias Esko, lo hice [averiguarlo] (http://stackoverflow.com/a/10888532/403455) aunque después de pasar varias horas tratando de reinventar la rueda. :) –

Cuestiones relacionadas