아아, 나는 Java에 가장 익숙하지만 기본적인 Java 지식을 많이 모릅니다. 예를 들어, 이전에는 과도 키워드를 사용하지 않았으므로 그 기능이 무엇인지 모르겠습니다. 오늘 필기 시험을 할 때, 나는 이것에 대한 질문이 있다는 것을 알았으므로, 나는 일시적인 키워드의 사용을 분류하고 자세를 높이는 데 시간을 보냈습니다 ~~~ 좋아요, 말도 안됩니다. 시작하겠습니다.
1. 일시적인 <br />의 역할과 사용법은 물체가 일련의 인터페이스를 구현하는 한 객체를 직렬화 할 수 있음을 알고 있습니다. Java 의이 직렬화 모델은 개발자에게 많은 편의를 제공합니다. 특정 직렬화 프로세스와 관련이 필요하지 않습니다. 이 클래스가 일련의 인터페이스를 구현하는 한,이 클래스의 모든 속성과 방법이 자동으로 직렬화됩니다.
그러나 실제 개발 과정에서 우리는 종종 그러한 문제에 직면합니다. 이 클래스의 일부 속성은 직렬화되어야하며 다른 속성은 직렬화 될 필요가 없습니다. 예를 들어, 사용자가 보안상의 이유로 민감한 정보 (예 : 암호, 은행 카드 번호 등)가있는 경우 네트워크 운영 (주로 직렬화 운영 포함, 로컬 직렬화 캐시도 적용 할 수 있음)에서 전송되기를 원하지 않으면 이러한 정보에 해당하는 변수는 과도 키워드와 함께 추가 될 수 있습니다. 다시 말해,이 필드의 수명주기는 발신자의 메모리에만 가능하며 지속성을 위해 디스크에 기록되지 않습니다.
요컨대, Java의 과도 키워드는 편의를 제공합니다. 직렬화 할 필요가없는 속성 앞에는 일련의 인터페이스를 구현하고 키워드 과도를 추가하면됩니다. 객체를 직렬화 할 때이 속성은 지정된 대상으로 직렬화되지 않습니다.
예제 코드는 다음과 같습니다.
import java.io.fileInputStream; import java.io.filenotFoundException; import java.io.fileoutputStream; import java.io.ioexception; import java.io.objectsputstream; import java.io.ObjectOutputStream; import java.io.serializable;/** @Dransient ANTINT AHWORDS를 사용하십시오. 변수 * 읽기시 읽기 순서는 데이터 저장 순서와 일치해야합니다 * @Author Alexia * @Date 2013-10-15 */public class transientTest {public static void main (String [] args) {user user = new user (); user.setusername ( "Alexia"); user.setpasswd ( "123456"); System.out.println ( "직렬화하기 전에 읽기 :"); System.out.println ( "사용자 이름 :" + user.getusername ()); System.err.println ( "비밀번호 :" + user.getPasswd ()); try {objectOutputStream os = new ObjectOutputStream (new FileOutputStream ( "c : /user.txt")); os.writeobject (사용자); // 사용자 객체를 파일에 os.flush ()에 씁니다. os.close (); } catch (filenotfoundException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } try {objectInputStream은 = new ObjectInputStream (new FileInputStream ( "c : /user.txt")); user = (user) is.readobject (); // 스트림에서 사용자의 데이터를 읽습니다. is.close (); System.out.println ( "Serializable 이후 :"); System.out.println ( "사용자 이름 :" + user.getusername ()); System.err.println ( "비밀번호 :" + user.getPasswd ()); } catch (filenotfoundException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } catch (classNotFoundException e) {e.printstacktrace (); }}} 클래스 사용자는 시리얼이즈 가능한 {private static final long serialversionuid = 8294180014912103005L; 개인 문자열 사용자 이름; 개인 과도 문자열 패스 웨드; public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPasswd () {return passwd; } public void setpasswd (String passwd) {this.passwd = passwd; }}출력은 다음과 같습니다.
직렬화하기 전에 읽기 : 사용자 이름 : AlexiaPassword : 123456 Serializable 이후에 읽기 : 사용자 이름 : AlexiaPassword : NULL
비밀번호 필드는 NULL이므로 사막화 중에 파일에서 정보를 얻지 못했습니다.
2. 일시적 사용량 요약
1) 변수가 과도에 의해 변수가 수정되면 변수는 더 이상 객체의 지속성의 일부가되지 않으며 직렬화 후 변수의 내용에 액세스 할 수 없습니다.
2) 과도 키워드는 변수 만 수정할 수 있지만 방법과 클래스는 수정할 수 없습니다. 일시적 키워드로 로컬 변수를 수정할 수 없습니다. 변수가 사용자 정의 클래스 변수 인 경우 클래스는 직렬화 가능한 인터페이스를 구현해야합니다.
3) 과도 키워드로 수정 된 변수는 더 이상 직렬화 될 수 없습니다. 정적 변수는 과도에 의해 수정되었는지 여부에 관계없이 직렬화 할 수 없습니다.
세 번째 요점은 사용자 클래스의 사용자 이름 필드에 정적 키워드를 추가 한 후 프로그램 실행 결과가 변경되지 않았다는 것을 알았 기 때문에 혼란 스러울 수 있습니다. 즉, 정적 유형의 사용자 이름도 "Alexia"로 읽습니다. 이것이 세 번째 요점과 모순되지 않습니까? 실제로, 그것은 다음과 같습니다. 세 번째 점은 실제로 정확합니다 (정적 변수는 과도에 의해 수정되었는지 여부에 관계없이 직렬화 할 수 없습니다). 탈선 후, 클래스의 정적 변수의 사용자 이름은 현재 JVM에서 해당 정적 변수의 값입니다. 이 값은 JVM의 사막화에서 파생되지 않습니다. 믿지 않습니까? 좋아, 아래를 증명하겠습니다.
import java.io.fileInputStream; import java.io.filenotFoundException; import java.io.fileoutputStream; import java.io.ioexception; import java.io.objectsputstream; import java.io.ObjectOutputStream; import java.io.serializable;/** @Dransient ANTINT AHWORDS를 사용하십시오. 변수 * 읽기시 읽기 순서는 데이터 저장 순서와 일치해야합니다 * @Author Alexia * @Date 2013-10-15 */public class transientTest {public static void main (String [] args) {user user = new user (); user.setusername ( "Alexia"); user.setpasswd ( "123456"); System.out.println ( "직렬화하기 전에 읽기 :"); System.out.println ( "사용자 이름 :" + user.getusername ()); System.err.println ( "비밀번호 :" + user.getPasswd ()); try {objectOutputStream os = new ObjectOutputStream (new FileOutputStream ( "c : /user.txt")); os.writeobject (사용자); // 사용자 객체를 파일에 os.flush ()에 씁니다. os.close (); } catch (filenotfoundException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } try {// deserialization user.username = "jmwang"전에 사용자 이름 값을 변경합니다. ObjectInputStream은 = new ObjectInputStream (new FileInputStream ( "c : /user.txt")); user = (user) is.readobject (); // 스트림에서 사용자의 데이터를 읽습니다. is.close (); System.out.println ( "Serializable 이후 :"); System.out.println ( "사용자 이름 :" + user.getusername ()); System.err.println ( "비밀번호 :" + user.getPasswd ()); } catch (filenotfoundException e) {e.printstacktrace (); } catch (ioexception e) {e.printstacktrace (); } catch (classNotFoundException e) {e.printstacktrace (); }}} 클래스 사용자는 시리얼이즈 가능한 {private static final long serialversionuid = 8294180014912103005L; 공개 정적 문자열 사용자 이름; 개인 과도 문자열 패스 웨드; public String getUserName () {return username; } public void setusername (String username) {this.username = username; } public String getPasswd () {return passwd; } public void setpasswd (String passwd) {this.passwd = passwd; }}실행 결과는 다음과 같습니다.
직렬화하기 전에 읽기 : 사용자 이름 : AlexiaPassword : 123456 Serializable 이후에 읽기 : 사용자 이름 : jmwangpassword : null
이는 사형화 된 클래스에서 정적 변수의 사용자 이름의 값이 현재 JVM에서 해당 정적 변수의 값이며, 이는 직렬화 중 Alexia 값이 아니라 수정 된 Jmwang입니다.
3. 과도 사용법 세부 사항 - 변수가 과도 키워드에 의해 수정 될 수 있습니까? 실제로 직렬화 될 수 있습니까?
다음 예에 대해 생각해보십시오.
import java.io.externalizable; import java.io.file; import java.io.fileInputStream; import java.io.fileoutputStream; import java.io.ioexception; import java.io.objectinputStream; import java.io.objectoutputstream;/** @descriptton externaliodable intervernalodable의 import java.io.objectStream; import java.io.obexception; @Date 2013-10-15 * */public class externalizabletest는 외부화 가능 {private transient string content = "예, 과도 키워드에 의해 수정되었는지 여부에 관계없이 직렬화됩니다."; @override public void writeExternal (ObjectOutput out)은 ioException {out.writeObject (content); } @Override public void readExternal (ObjectInput in)은 ioException, classNotFoundException {content = (string) in.readObject (); } public static void main (string [] args)은 예외 {externalizabletest et = new externalizableTest (); ObjectOutput out = new ObjectOutputStream (new FileOutputStream (새 파일 ( "test"))); out.writeObject (et); ObjectInput in = new ObjectInputStream (new FileInputStream (새 파일 ( "test"))); et = (externalizabletest) in.readobject (); System.out.println (et.content); out.close (); 넣다(); }} 내용 변수가 직렬화됩니까? 좋아, 나는 모든 답을 출력했다. 예, 결과는 다음과 같습니다.
예, 과도 키워드에 의해 수정되었는지 여부에 관계없이 직렬화됩니다.
이게 왜? 과도 키워드에 의해 수정 된 후 클래스의 변수가 직렬화되지 않을 것이라고 말하지 않습니까?
Java에서는 두 개의 인터페이스를 구현하여 객체 직렬화를 구현할 수 있음을 알고 있습니다. 직렬화 가능한 인터페이스가 구현되면 모든 직렬화가 자동으로 수행됩니다. 외부화 가능한 인터페이스가 구현되면 자동으로 직렬화 할 수 없습니다. WriteExternal 메소드에서 직렬화 할 변수를 수동으로 지정해야하며, 이는 과도에 의해 수정되었는지 여부와 관련이 없습니다. 따라서 두 번째 예제는 가변 콘텐츠에 의해 초기화 된 컨텐츠를 NULL이 아닌 출력합니다.
저자 : Alexia (Minmin)
나와 의사 소통하고 상호 작용하려면 Weibo : http://www.cnblogs.com/lanxuezaipiao/p/3369962.html로 문의하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.