Javaトランジェントキーワード
1。一時的な関数と使用方法
私たちは皆、オブジェクトがセリリライズ可能なインターフェイスを実装する限り、オブジェクトをシリアル化できることを知っています。 Javaのこのシリアル化モデルは、開発者に多くの利便性を提供します。特定のシリアル化プロセスに関連する必要はありません。このクラスがセリリライズ可能なインターフェイスを実装する限り、このクラスのすべてのプロパティとメソッドは自動的にシリアル化されます。
ただし、実際の開発プロセスでは、そのような問題に遭遇することがよくあります。このクラスの一部のプロパティはシリアル化する必要がありますが、他のプロパティはシリアル化する必要はありません。たとえば、ユーザーがセキュリティ上の理由でいくつかの機密情報(パスワード、銀行カード番号などなど)を持っている場合、ネットワーク操作(主にシリアル化操作を含む、ローカルシリアル化キャッシュも適用される)に送信されたくありません。これらの情報に対応する変数は、一時的なキーワードで追加できます。言い換えれば、このフィールドのライフサイクルは発信者のメモリのみにあり、持続性のためにディスクに書かれていません。
要するに、Javaの一時的なキーワードは利便性を提供します。 Serilizableインターフェイスを実装し、シリアル化する必要のない属性の前にキーワード過渡を追加するだけです。オブジェクトをシリアル化する場合、この属性は指定された宛先にシリアル化されません。
例コードは次のとおりです。
java.io.fileinputStream; Import java.io.fileenotfoundexceptionception; Import java.io.fileoutputStream; import java.io.io.ioexception; Import java.objectinputStream; import java.io.io.objectputStream; Import java.objectStream; Import Java.io.io.searizable;変数 *読み取りの場合、データの順序はデータを保存する順序と一致している必要があることに注意してください * * @author alexia * @date 2013-10-15 * http://www.manongjc.com/article/1609.html */public class transienttest {public static void main [] {args); user.setUsername( "Alexia"); user.setpasswd( "123456"); system.out.println( "serializableの前に読む:"); system.out.println( "username:" + user.getusername()); System.err.println( "password:" + user.getPasswd()); try {objectoutputStream os = new objectOutputStream(new FileOutputStream( "c:/user.txt")); os.writeobject(user); //ユーザーオブジェクトをファイルに書き込みますos.flush(); os.close(); } catch(filenotfoundexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); } try {objectInputStream is = new objectInputStream(new FileInputStream( "c:/user.txt")); user =(user)is.readobject(); //ストリームからユーザーのデータを読み取ります。close(); System.out.println( "/nread serializable:"); system.out.println( "username:" + user.getusername()); System.err.println( "password:" + user.getPasswd()); } catch(filenotfoundexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); } catch(classNotFoundException e){e.printstacktrace(); }}} classユーザーはSerializable {private static final long serialversionuid = 8294180014912103005l;プライベート文字列ユーザー名;プライベートトランジェント文字列passwd; 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; }}出力は次のとおりです。
Serializableの前に読む:username:alexiapassword:123456read serializable:username:alexiapassword:null
パスワードフィールドはnullです。つまり、降下中にファイルから情報が取得されなかったことを意味します。
2。一時的な使用概要
1)変数が過渡的に変更されると、変数はオブジェクトの持続性の一部ではなくなり、シリアル化後に変数の内容にアクセスできません。
2)一時的なキーワードは、変数のみを変更できますが、メソッドとクラスは変更できません。ローカル変数は、一時的なキーワードで変更できないことに注意してください。変数がユーザー定義のクラス変数である場合、クラスはシリアル化可能なインターフェイスを実装する必要があります。
3)過渡キーワードによって変更された変数は、もはやシリアル化できなくなります。静的変数は、一時的に変更されているかどうかにかかわらず、シリアル化することはできません。
3番目のポイントは混乱する可能性があります。これは、ユーザークラスのユーザー名フィールドに静的キーワードを追加した後、プログラムの実行結果が変更されたままであることを発見したため、静的タイプのユーザー名も「Alexia」と読みます。これは3番目のポイントと矛盾していませんか?実際、それは次のとおりです。3番目のポイントは確かに正しいです(静的変数は、トランジェントによって変更されるかどうかに関係なくシリアル化できません)。降下後、クラスの静的変数のユーザー名は、現在のJVMの対応する静的変数の値です。この値は、JVMの脱介入から派生したものではありません。信じられない?わかりました、以下でそれを証明させてください:
java.io.fileinputStream; Import java.io.fileenotfoundexceptionception; Import java.io.fileoutputStream; import java.io.io.ioexception; Import java.objectinputStream; import java.io.io.objectputStream; Import java.objectStream; Import Java.io.io.searizable;変数 *読み取りの順序は、データを保存する順序と一致する必要があることに注意してください * * @author alexia * @date 2013-10-15 * http://www.manongjc.com */public class transienttest {public static void main(string [] args){user user = new user = new user(); user.setUsername( "Alexia"); user.setpasswd( "123456"); system.out.println( "serializableの前に読む:"); system.out.println( "username:" + user.getusername()); System.err.println( "password:" + user.getPasswd()); try {objectoutputStream os = new objectOutputStream(new FileOutputStream( "c:/user.txt")); os.writeobject(user); //ユーザーオブジェクトをファイルに書き込みますos.flush(); os.close(); } catch(filenotfoundexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); } try {// desarialization user.username = "jmwang"; ObjectInputStream is = new ObjectInputStream(new FileInputStream( "c:/user.txt")); user =(user)is.readobject(); //ストリームからユーザーのデータを読み取ります。close(); System.out.println( "/nread serializable:"); system.out.println( "username:" + user.getusername()); System.err.println( "password:" + user.getPasswd()); } catch(filenotfoundexception e){e.printstacktrace(); } catch(ioexception e){e.printstacktrace(); } catch(classNotFoundException e){e.printstacktrace(); }}} classユーザーはSerializable {private static final long serialversionuid = 8294180014912103005l; public static stringユーザー名。プライベートトランジェント文字列passwd; 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; }}操作結果は次のとおりです。
Serializableの前に読む:username:alexiapassword:123456read serializable:username:jmwangpassword:null
これは、脱力化クラスの静的変数のユーザー名の値が、シリアル化中の値アレキシアではなく、修正されたJMWANGである現在のJVMの対応する静的変数の値であることを意味します。
3.一時的な使用状況の詳細 - 過渡キーワードによって変更された変数は本当にシリアル化できますか?
次の例について考えてください。
java.io.externalizable; Import java.io.file; Import java.io.fileinputStream; Import java.io.fileoutputStream; Import java.io.ioexception; Import java.io.objedinputStream; Import Java.io.io.io.objectutputtream; @date 2013-10-15 * */public class externalizabletestは外部化可能{プライベートトランジェント文字列コンテンツ= "はい、一時的なキーワードで変更されているかどうかに関係なくシリアル化されます"; @Override public void writeExternal(objectOutput out)throws ioException {out.writeObject(content); } @Override public void readexternal(objectInput in)throws ioException、classNotFoundException {content =(string)in.ReadObject(); } public static void main(string [] args)throws exception {externalizabletest et = new externalizabletest(); objectOutput out = new objectOutputStream(new FileOutputStream(new File( "test"))); out.writeObject(et); objectInput in = new objectInputStream(new FileInputStream(new File( "test"))); et =(externalizabletest)in.ReadObject(); System.out.println(et.content); out.close(); in.close(); }}コンテンツ変数はシリアル化されますか?わかりました、すべての答えを出力しました、はい、結果は次のとおりです。
はい、一時的なキーワードによって変更されているかどうかに関係なく、私はシリアル化されます
なぜこれがなぜですか?クラスの変数は、一時的なキーワードによって変更された後にシリアル化されないと言われていませんか?
Javaでは、2つのインターフェイスを実装することにより、オブジェクトのシリアル化を実装できることがわかっています。シリアル化可能なインターフェイスが実装されている場合、すべてのシリアル化が自動的に実行されます。外部化可能なインターフェイスが実装されている場合、自動的にシリアル化することはできません。 WriteExternalメソッドでシリアル化される変数を手動で指定する必要があります。これは、Transientによって変更されるかどうかとは関係ありません。したがって、2番目の例は、nullではなく変数コンテンツによって初期化されたコンテンツを出力します。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!