Java 과도 키워드
1. 과도의 기능 및 사용법
우리는 객체가 일련의 인터페이스를 구현하는 한 객체를 직렬화 할 수 있음을 알고 있습니다. 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 * http://www.manongjc.com/article/1609.html */public static void main (string [] args) {user 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 * http://www.manongjc.com */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이 아닌 출력합니다.
읽어 주셔서 감사합니다. 도움이되기를 바랍니다. 이 사이트를 지원 해주셔서 감사합니다!