Spec-Zone .ru
спецификации, руководства, описания, API
|
Сериализировать объект означает преобразовывать его состояние в поток байтов так, чтобы поток байтов мог вернуться назад в копию объекта. Объект Java сериализуем, если его class или какой-либо из его суперклассов реализуют или интерфейс java.io.Serializable или его подынтерфейс, java.io.Externalizable. Десериализация является процессом преобразования сериализированной формы объекта назад в копию объекта.
Например, java.awt.Button, class реализует интерфейс Serializable, таким образом, можно сериализировать объект java.awt.Button и хранилище, которое сериализировало состояние в файле. Позже, можно считать назад сериализированное состояние и десериализовать в объект java.awt.Button.
Платформа Java определяет значение по умолчанию путь, которым сериализируются сериализуемые объекты. (Java) class может переопределить эту сериализацию значения по умолчанию и определить ее собственный способ сериализировать объекты того class. Объектная Спецификация Сериализации описывает объектную сериализацию подробно.
Когда объект сериализируется, информация, которая идентифицирует ее class, записывается в сериализованном потоке. Однако, определение class ("файл class") непосредственно не записывается. Это - ответственность системы, которая десериализовывает объект определить, как определить местоположение и загрузить необходимые файлы class. Например, приложение Java могло бы включать в его путь к классу файл JAR, который содержит файлы class сериализированного объекта (ов), или загрузите определения class при использовании информации, хранившей в каталоге, как объяснено позже в этом уроке.
Можно хранить сериализуемый объект в каталоге, если базовый поставщик услуг поддерживает то действие, так что делает поставщика услуг Sun LDAP.
Следующий пример вызывает Context.bind
DirContext.bind
Context.rebind
DirContext.rebind
// Create the object to be bound Button b = new Button("Push me"); // Perform the bind ctx.bind("cn=Button", b);
Можно тогда считать объект назад использование Context.lookup
// Check that it is bound Button b2 = (Button)ctx.lookup("cn=Button"); System.out.println(b2);
Выполнение this example
производит следующий вывод.
# java SerObj java.awt.Button[button0,0,0,0x0,invalid,label=Push me]
Отметьте: процедуры, описанные здесь, для того, чтобы связать сериализуемый объект в службе каталогов, которая следует за схемой, определенной в RFC 2713. Эти процедуры не могли бы быть обычно применимыми к другому именованию и службам каталогов, которые поддерживают привязку сериализуемого объекта с указанной кодовой базой.
Когда сериализированный объект связывается в каталоге как показано в предыдущем примере, у приложений, которые читают сериализированный объект из каталога, должен быть доступ к определениям class, необходимым, чтобы десериализовать объект.
Альтернативно, можно записать кодовую базу с сериализированным объектом в каталоге, или когда Вы связываете объект или впоследствии добавляя атрибут при использовании DirContext.modifyAttributes
Следующий пример напоминает тот для того, чтобы связать java.awt.Button. Это отличается, в котором это использует определяемый пользователем Serializable class, Flower
, и предоставляет атрибут "javaCodebase", который содержит расположение определения class Flower. Вот код, который делает привязку.
String codebase = ...; // Create the object to be bound Flower f = new Flower("rose", "pink"); // Perform the bind and specify the codebase ctx.bind("cn=Flower", f, new BasicAttributes("javaCodebase", codebase));
Когда Вы работаете this example
, следует предоставить URL расположения, в котором файл class был установлен Flower.class. Например, если бы Flower.class был установлен в веб-сервере web1 в каталоге example/classes, то Вы выполнили бы этот пример следующим образом.
# java SerObjWithCodebase http://web1/example/classes/ pink rose
Позже, можно удалить Flower.class из своего пути к классу и выполнить любую программу, которая ищет или перечисляет этот объект, непосредственно не ссылаясь на Flower class. Если Ваши ссылки программы Flower непосредственно, то следует сделать его файл class доступным для компиляции и выполнения.