2014-05-26 2 views
-2

В java, если мы реализуем интерфейс в классе, мы должны предоставить реализацию методам, присутствующим в интерфейсе., Но в случае интерфейса Serializable нам не нужно предоставлять реализацию для методы представлены в интерфейсе Serializable.Почему ???Концепция реализации интерфейса

+0

Интерфейс Serializable не содержит никаких методов. Я думаю, что версия TL; DR - это потому, что потребность в данных Serialize появилась до того, как в Java были аннотации. Если бы вы сделали это сегодня, вы, вероятно, использовали бы аннотацию, так же JPA использует @Entity, но изменение этого приведет к поломке всего кода. –

ответ

2

, но в случае интерфейса Serializable нам не нужно предоставлять реализации методам, присутствующим в Serializable interface.Why ???

Потому что для маркировки только целей и не содержит не методы реализации.

Когда класс «с пометкой« »с интерфейсом Serializable, это просто означает, что он должен/может быть сериализован/де-сериализован.

От компании Oracle docs:

Классы, которые не реализуют этот интерфейс не будет иметь какой-либо из их состояния сериализованная или десериализации. Все подтипы сериализуемого класса сами являются сериализуемыми. Интерфейс сериализации не имеет методов или полей , а служит только для определения семантики нахождения serializable.

И от Wikipedia:

Пример применения маркерных интерфейсов от языка программирования Java является Serializable интерфейс. Класс реализует этот интерфейс, чтобы указать, что его непереходные элементы данных могут быть , записанные в ObjectOutputStream. ObjectOutputStream private метод writeObject() содержит последовательность экземпляров тестов до , определяющих способность к записи, одна из которых ищет интерфейс Serializable . Если какой-либо из этих тестов выходит из строя, метод генерирует NotSerializableException.

Например, если следующий класс would't был отмечен с интерфейсом Serializable:

public class Employee implements java.io.Serializable 
{ 
    public String name; 
    ... 
} 

Тогда следующий код сериализации будет иметь завершаться NotSerializableException:

Employee e = new Employee(); 
e.name = "Reyan Ali"; 

FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser"); 
ObjectOutputStream out = new ObjectOutputStream(fileOut); 
out.writeObject(e); 
out.close(); 
fileOut.close(); 
System.out.printf("Serialized data is saved in /tmp/employee.ser"); 

Примечание к расширению файла *.ser, оно используется, когда w ринирование сериализованных java-объектов в файлы.

+0

Я действительно хочу знать, как интерфейс-маркер работает внутри? –

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