Хотя интерфейс Serializable в Java не имеет методов, никаких полей, он может выполнять свою функцию. Как?

Хотя интерфейс java.io.Serializable public interface Serializable{} неожиданно не содержит каких-либо методов и полей в Java, класс, реализующий этот интерфейс, способен выполнять функцию сериализации и десериализации (состояние сериализуемого объекта или десериализован). Как он может выполнять функцию сериализации и десериализации без каких-либо методов или полей в Java?

Ответ 1

Некоторые интерфейсы служат только как "маркеры" или "флаги".

Доступ к UID и пользовательским читателям/писателям осуществляется с помощью отражения.

Serializable является маркером, а JRE/JVM может принимать действие на основе его присутствия.

http://en.wikipedia.org/wiki/Marker_interface_pattern

Ответ 2

Serializable не содержит никакого метода, ObjectOutputStream и ObjectInputStream, которые могут выполнять эту работу с помощью методов writeObject и readObject.

Serializable - это просто интерфейс маркера, другими словами он просто помещает флаг, не требуя никаких полей или методов.

Ответ 3

Интерфейс Serializable является интерфейсом маркера, который только уведомляет JVM о том, что определенный объект настроен на сериализацию. Процесс сериализации происходит внутри.

Ответ 4

Лучший дизайн был бы

interface Serializable

    void writeObject(ObjectOutputStream out)

    void readObject(ObjectInputStream in)

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

class MyClass implements Serializable

    // stupid boilerplate code
    void writeObject(ObjectOutputStream out)
    { 
        Util.defaultWriteObject(this, out);
    }  

В Java 8 это изменится, у нас могут быть установки по умолчанию для методов интерфейса

interface Serializable

  void writeObject(ObjectOutputStream out) default Util::defaultWriteObject

  void readObject(ObjectInputStream in) default Util::defaultReadObject

(Serializable не будет изменен, но новая функция может использоваться в сопоставимых случаях)

Ответ 5

Я согласен с irreputable, прежде всего неявное утверждение о том, что каждый объект должен знать, как сериализовать/десериализовать себя, кроме его/ее утверждения, что:

нет способа предоставить default implementationmentsquote

Конечно, есть: Состав объекта.

Ответ 6

Сериализация - это способ сохранения объектов, и мы используем интерфейс Serializable для достижения нашей цели. Сериализуемый интерфейс является интерфейсом маркера. Шаблон интерфейса маркера представляет собой шаблон проектирования и предоставляет информацию о времени выполнения объекта.

Ответ 7

Если вы видите реализацию метода writeObject объекта ObjectOutputStream, следуя фрагменту кода, который вы увидите внутри реализации.

Здесь вы можете увидеть, если ваш класс не реализует интерфейс Serializable, тогда Исключение NotSerializableException.

if (obj instanceof String) {
    writeString((String) obj, unshared);
} else if (cl.isArray()) {
    writeArray(obj, desc, unshared);
} else if (obj instanceof Enum) {
    writeEnum((Enum<?>) obj, desc, unshared);
} else if (obj instanceof Serializable) {
    writeOrdinaryObject(obj, desc, unshared);
} else {
    if (extendedDebugInfo) {
        throw new NotSerializableException(
            cl.getName() + "\n" + debugInfoStack.toString());
    } else {
        throw new NotSerializableException(cl.getName());
    }
}

Serializable - это просто интерфейс маркера. Java внутренне использует это для убедитесь, что если объект на самом деле доступен для записи или нет.