2013-03-11 2 views
0

Я знаю, что Serializable является интерфейсом маркера. Тогда что означают подписи ниже?Класс, который реализует Serializable, должен внедрить некоторые методы?

private void writeObject(java.io.ObjectOutputStream out) 
    throws IOException 
private void readObject(java.io.ObjectInputStream in) 
    throws IOException, ClassNotFoundException; 
private void readObjectNoData() 
    throws ObjectStreamException; 

Это из http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html

и на странице написано как «Классы, которые требуют специальной обработки в процессе сериализации и десериализации должен реализовать специальные методы с этими точными подписями:»

Я м запутался. Является ли Serializable интерфейсом маркера?

+0

И они также являются частными! O_o – Tallmaris

ответ

1

Да, Serializable является интерфейсом маркера. Эти методы должны реализовывать только классы, требующие специальной обработки.

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

0

Эти методы используются для настройки процесса сериализации. Я приведу вам пример.

class Person implements java.io.Serializable { 

int id; 
String name; 
String city; 

Person(int id, String name, String city) { 
    this.id = id; 
    this.name = name; 
this.city = city; 
} 

private void writeObject(java.io.ObjectOutputStream stream) 
     throws IOException { 
    stream.writeInt("ID : " + id); 
    stream.writeObject("Name : " + name); 
    stream.writeObject("City : " + city); 
} 

private void readObject(java.io.ObjectInputStream stream) 
     throws IOException, ClassNotFoundException { 
    id = stream.readInt(); 
    name = (String) stream.readObject(); 
    city = (String) stream.readObject(); 
} 

public String toString() { 
    return id + "\t" + name + "\t" + city + "\t"; 
} 
} 

Обратите внимание, что сериализация настраивается с использованием этих методов. Я добавил строковые константы в метод writeObject при сериализации полей, которые метод сериализации по умолчанию не будет выполнять.

0

Я буду бросать дикую догадку здесь по причине, почему. Учитывая тот факт, что вы можете использовать теги для определения того, какие поля являются сериализуемыми, моя первая мысль состоит в том, что внутренняя обработка сериализации, например, в ObjectOutputStream, осуществляется посредством отражения.

Так что, возможно, метод writeObject также проверяет, существует ли частный метод с той же сигнатурой, определенный на объекте, и называет это, если это так. В конце концов, этот же метод уже использует отражение, позволяющее определить, какое поле сериализуется и как, так и проверка существования специального метода не является массивной накладной, я считаю ...

Это может показаться немного странным но звучит как достойное решение. Форсировать реализацию в интерфейсе было бы слишком много, так как большая часть времени является общей. Использование абстрактного класса было бы невозможно в модели Singe Inheritance, такой как Java. C# использует атрибуты (эквивалент @ аннотаций в Java).

Надеюсь, что кто-то с большим количеством знаний может пролить больше света на это. :)

0

Его простой. Если вы хотите использовать специальную сериализацию, вы предоставляете вышеупомянутые методы вам в классе, который должен быть сериализован.

Пример: Если вы seriailizing User.java предоставляют следующие методы в этом классе для пользовательских сериализации: личного недействительного writeObject (java.io.ObjectOutputStream из) бросков IOException частная пустота readObject (java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;

Во всяком случае, когда вы вызываете сериализацию объекта через объект objectOutputStream.writeObject (объект, который в этом случае является пользователем), элемент управления будет автоматически перенаправлен на метод writeObject пользователя User.java.

Если вы не предоставляете методы в User.java. Затем процесс идет по умолчанию.

Примечание: если вы предоставляете реализацию writeObject/readObject как в классе, который будет сериализован, тогда работает только пользовательская сериализация, в противном случае он использует маршрут по умолчанию. Надеюсь, это поможет!

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