How can I serialize an interface?

后端 未结 3 1620
后悔当初
后悔当初 2021-01-02 03:53

Suppose I have a Serializable class ShapeHolder that owns an object that implements a Serializable Shape interface. I wa

相关标签:
3条回答
  • 2021-01-02 04:17

    Java's Serializable does this for you automatically.

    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 讨论(0)
  • 2021-01-02 04:26
    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();
        }
    }
    
    0 讨论(0)
  • 2021-01-02 04:38

    I want to make sure the correct concrete shape object is saved (and the correct type is later restored).

    Java's default serialization (ObjectInputStream & ObjectOutputStream) does that out-of-the-box. When serializing, Java writes there the name of the concrete class and then uses in when deserializing.

    0 讨论(0)
提交回复
热议问题