Вопрос по types, java, oop – Как я могу сериализовать интерфейс?

9

Предположим, у меня естьSerializable учебный классShapeHolder который владеет объектом, который реализуетSerializable Shape интерфейс. Я хочу убедиться, что правильный конкретный объект формы сохранен (и правильный тип позже восстановлен).

Как я могу сделать это?

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;
}

Ваш Ответ

3   ответа
7

Java'sSerializable делает это автоматически.

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 {
        sh,apeClassName = 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();
    }
}
Alexeyy, в конечном итоге вся эта работа выполняется автоматически при добавленииextends Serializale. Я не осознавал этого, когда писал вопрос. Я не уверен, что вы уже знали это и были смущены моим вопросом новичка. Jeff Axelrod
0

что правильный бетонный объект формы сохранен (и правильный тип позже восстановлен).

Сериализация Java по умолчанию (ObjectInputStream & ObjectOutputStream) делает это «из коробки». При сериализации Java записывает туда имя конкретного класса и затем использует его при десериализации.

Спасибо Esko, я сделал Сконфигурируй это хотя и потратил несколько часов, пытаясь изобрести велосипед. :) Jeff Axelrod

Похожие вопросы