Что делать JVM с интерфейсом маркера в Java

В ответ на вопрос, что JVM дает дополнительную обработку классам, реализующим интерфейс Marker. Например, я протестировал его с помощью Serializable, как показано ниже:

импорт java.io.*;

public class SerialazationDemo {
    public static void main(String[] args) {
        //serialized object
/*      Employee e = new Employee();
        e.name = "Reyan Ali";
        e.address = "Phokka Kuan, Ambehta Peer";
        e.SSN = 11122333;
        e.number = 101;
        try {
            FileOutputStream fileOut = new FileOutputStream("E:\\temp\\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");
        } catch (IOException i) {
            i.printStackTrace();
        }*/

        //deserialized object
         Employee e = null;
          try
          {
             FileInputStream fileIn = new FileInputStream("E:\\temp\\employee.ser");
             ObjectInputStream in = new ObjectInputStream(fileIn);
             e = (Employee) in.readObject();
             in.close();
             fileIn.close();
          }catch(IOException i)
          {
             i.printStackTrace();
             return;
          }catch(ClassNotFoundException c)
          {
             System.out.println("Employee class not found");
             c.printStackTrace();
             return;
          }
          System.out.println("Deserialized Employee...");
          System.out.println("Name: " + e.name);
          System.out.println("Address: " + e.address);
          System.out.println("SSN: " + e.SSN);
          System.out.println("Number: " + e.number);
    }
}

class Employee {
    public String name;
    public String address;
    public transient int SSN;
    public int number;

    public void mailCheck() {
        System.out.println("Mailing a check to " + name + " " + address);
    }
}

И я обнаружил, что jvm дает исключение как java.io.NotSerializableException Но FILES был создан по заданному пути, похожее исключение для десериализации. Так почему же JVM требовала его сериализации, он мог напрямую разрешить создание сериализации.?

4 ответа

Вопрос сказал, что JVM дает дополнительную обработку классам, реализующим интерфейс Marker

Правильный ответ на этот вопрос - ничто. Но это, вероятно, требует разъяснения, так как спрашивающий может использовать термины неточно.

JRE рассматривает их специально в соответствующих местах. Это действие находится в библиотеке классов Java, а не в JVM. Например:

  • Object.clone() проверяет, что объект реализует Cloneable.
  • ObjectOutputStream.writeObject() проверяет, что записываемый объект реализует Serializable.
  • rmic и части теста времени выполнения RMI, что удаленный объект реализует удаленный интерфейс, что означает интерфейс, который расширяет Remote.

Это не имеет ничего общего с JVM .

Я обнаружил, что jvm дает исключение как java.io.NotSerializableException

Нет, ты не сделал. Вы нашли это ObjectOutputStream.writeObject() бросил исключение. Это не одно и то же.

Но ФАЙЛЫ были созданы по заданному пути

Файл был создан new FileOutputStream(...), который уже выполнен, прежде чем вы получили исключение.

Так почему же JVM требовала его сериализации, он мог напрямую разрешить создание сериализации.?

Это не так. Смотри выше. Но ObjectOutputStream.writeObject() делает, и это так, потому что делает все Serializable имеет множество недостатков, которые необходимо учитывать, прежде чем предлагать его. Рассмотрим, например, угрозу безопасности поля сериализуемого пароля, которое вы не намеревались.

Что такое интерфейс маркера?

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

Интерфейс маркера просто помечает класс как принадлежащий к определенному типу.

Зачем нужен маркерный интерфейс?

Интерфейс маркера используется в качестве тега для сообщения сообщения компилятору java, чтобы он мог добавить специальное поведение к реализующему его классу. Так что, если JVM видит, что класс является сериализуемым, он выполняет над ним какую-то специальную операцию.

Что делает JVM с интерфейсом Serialiize?

Когда класс реализует сериализуемый интерфейс, он гарантирует JVM, что этот класс может обеспечивать специальное поведение (сериализация / десериализация) во время выполнения.

Поэтому, когда вы пытаетесь сериализовать объект,JVM хочет подтвердить, что класс объекта этого типа заключил контракт (Реализация интерфейса Serialize), чтобы показать это специальное поведение во время выполнения (Для сериализации / десериализации). Если он реализован,JVM Гарантируется, что он может продолжить сериализацию. В противном случае выдается исключение, что вы пытаетесь сериализовать объект, который не согласен с условиями готовности к сериализации или десериализации.

Если объект не Serializable его состояние не может быть сохранено с помощью ObjectOutputStrem,

Файл должен быть создан, потому что это делается с помощью FileInputStream и как только вы закроете поток, появится новый файл. Но если попытаться проверить содержимое файла, он должен быть пустым, поскольку состояние несериализуемого состояния не будет сохранено.

Причина, по которой вам необходимо продлить Serializable (или же Externalizable), чтобы убедиться, что вы сериализуете только те классы, которые предназначены для сериализации. Вы, конечно, не хотите сериализовать классы, которые не предназначены для него, потому что тогда их формат будет довольно хрупким; малейшее изменение в классе сломало бы вашу десериализацию.

Можно утверждать, что такая же хрупкость применяется к классам, отмеченным Serializable, но вы должны думать о стабильности серийной формы при пометке класса как Serializable (или иначе явно дезавуировать любую стабильность, как это делает Гуава).

Другие вопросы по тегам