2015-01-27 5 views
1

Я пытаюсь узнать сериализацию и где я не могу понять нижеследующую концепцию.Более глубокое понимание сериализации

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

public class CustomizedSerialization{ 
public static void main(String[] args) throws IOException{ 

Account acc= new Account(); 

System.out.println("Serialization Started"); 
FileOutputStream fos= new FileOutputStream("userDetail.txt"); 
ObjectOutputStream oos= new ObjectOutputStream(fos); 
oos.writeObject(acc); 
System.out.println("Serialization Ended"); 

} 
} 

class Account implements Serializable{ 
String username="myusername"; 
transient String password="mypassword"; 
} 


Fine it runs as expected the output is 
Account UserName myusername 
Account Password null 

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

Теперь добавьте следующий код в моем классе Account

private void writeObject(ObjectOutputStream os) throws Exception{ 
    System.out.println("writeObject Callback"); 
    os.defaultWriteObject(); 
    os.writeObject(password); 
} 

private void readObject(ObjectInputStream ois) throws Exception{ 
    ois.defaultReadObject(); 
    System.out.println("ReadObject Callback"); 
    this.password=(String)ois.readObject(); 
} 

Круто работает работу ....

Account UserName myusernamedurga 
Account Password mypassword 

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

Спасибо.

+0

В этом примере это верно. ** Однако **, * вы не должны «Сериализовать» пароль (ы) *. –

+1

Может кто-нибудь объяснить * что? * Вы добавили 'transient', чтобы он не сериализовался; вы добавили методы, чтобы они вручную сериализовались; вы удалили их оба, и он автоматически сериализуется. Что за вопрос? – EJP

+0

@EJP, вы говорите, что эти методы предназначены для ручной сериализации. Не могли бы вы рассказать мне, насколько это отличается от обычной сериализации с временным ключевым словом. – user3473132

ответ

3

Если вы объявите свой класс Serializable, Java будет сериализовать все его поля.

Вы можете отключить это выборочно для некоторых полей, сделав эти transient.

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

И, наконец, вы можете смешивать и сопоставлять: Реализовать два метода, но по-прежнему иметь Java-сериализацию «простых полей». Для этого вы вызываете defaultWriteObject из вашей собственной реализации writeObject. Это приведет к сериализации всех полей, которые не являются временными для вас, поэтому вам нужно только беспокоиться о других.

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

Да. Если стандартный способ сериализации, предлагаемый просто объявлением Serializable, достаточно для вас, то вы можете просто сделать это.

Вам нужно всего лишь использовать transient, writeObject и т. Д., Если вы хотите что-то настроить (например, не выписывая пароль вообще или не записывая его каким-либо зашифрованным способом).

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