2010-06-29 2 views
2

У меня есть сложный объект с полями и ссылкой на базу данных, которые я хотел бы передать как сериализованный объект. Я реализовал интерфейс, но, с другой стороны, он не работает и получает непредвиденные ошибки.Как настроить сериализацию сложного объекта?

Что бы я хотел сделать, это до сериализации, чтобы сообщить, что только идентификатор сериализуется, и после десериализации, чтобы вернуть идентификатор и восстановить объект более легко.

Для того, чтобы помочь для кода, у меня есть

setId(); 
getId(); 
and Load() methods 

Я хотел бы быть сделано изнутри объекта.

Как это можно сделать?

ответ

4

Бессмысленно serialize ресурс базы данных, поэтому вы хотите установить свои несериализуемые поля как transient, а затем разрешить их в методе readObject. например .:

private int id; 
private transient java.sql.Connection connection; 

private void readObject(ObjectOutputStream out) throws IOException { 
    out.defaultReadObject(); 
    connection = DriverManager.getConnection(); 
} 

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

+0

Не могли бы вы помочь мне с примером для нескольких полей. Это моя первая задача - сериализация. – Pentium10

+0

Просто взгляните на JavaDoc 'Serializable'. – musiKk

+0

Другой вопрос. У меня есть 3 уровня наследования, abstract-> first imp-> вторая реализация. Второй вариант является сериализуемым, но база данных определена абстрактно. Должен ли я отмечать все поля как временные в реализации абстрактного и первого уровня? – Pentium10

2

Взгляните на пункты 54, 55, 56 и 57 эффективной Java (Joshua Bloch), которые рассказывают о сериализации. Подведение итогов

  1. Не используйте его, пока вы не будете абсолютно обязаны.
  2. Имейте serialVersionUID для своего класса. (Пожалуйста, не держите его как 1)
  3. Обеспечить readObject, writeObject тщательно
  4. Не забудьте позвонить defaultReadObject и defaultWriteObject в вышеприведенных два
  5. Отметить все поля не сериализации, как транзиторная
  6. Отметить все поля переходный процесс, который может быть сконструирован с другими полями
  7. Рассмотрите возможность использования пользовательской сериализованной формы (элемент 55 Эффективная Java), если у вас есть Связанные списки и т. д.
  8. Позаботьтесь, если вы класс Singleton. Предоставьте метод readResolve

И, наконец, внимательно прочитайте javadoc для Serializable и пункт 54-57 эффективной Java. Он ответит и на ваш другой вопрос.

Cheers

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