物件轉成字串再還原,對於物件網絡問題的實驗結果分享 |
|
JackTasy
初階會員 發表:22 回覆:97 積分:28 註冊:2002-06-06 發送簡訊給我 |
大家好,之前小弟一直在找尋模擬 session 的方法,在觀摩了 JSPWedget 寫法後發現孫三才講師範例適用在 SessionID,SessionValue 都是單純字串的時候,因為當物件中又指向其他物件時,轉出的 Base64 String 就會變很長(Data Member 沒有 Reference 時,String Length 只有 36 ,比較短),所以我就寫了一個簡單的程式來測試這種物件網絡情形,並設法還原成原物件,發現 Base64 的確可以做到『深層拷貝』,還原後的物件不失真。
有了這個結論,定義資料庫時 SessionValue 開大一點甚至用 Text Field 就 ok 啦。
以下附上整個程式碼供大家參考:
package io; import java.io.*; import com.ucom.util.Base64; public class TestBase64 { public TestBase64() { } public static void main(String[] args) { //Step 1.產生一條蟲,並且連續傳連出六條蟲 (Data Member 是一個 Reference,指向另一個 Object Instance) Worm w = new Worm(6, 'A'); System.out.println("w=" w); //Step 2.將 蟲 物件轉換成 Base64 字串,並觀察其內容 (Object to Base64 String) String sBase64 = Base64.encodeObject(w); int iLength = sBase64.length(); System.out.println("sBase64=" sBase64 " ,Length=" iLength); //Step 3.把 Base64 字串還原成原來的物件 (Base64 String to Object) Worm w2 = (Worm) Base64.decodeToObject(sBase64); //記得轉型一下! System.out.println("w2=" w2); } } //蟲物件 裡所具備的 Data Member class Data implements Serializable { private int i; Data(int i_) { i = i_; } public String toString() { return Integer.toString(i); } } //蟲物件 class Worm implements Serializable { private static int r() { return (int) (Math.random() * 10); } private Data[] d = { new Data(r()), new Data(r()), new Data(r()) }; private Worm nextWorm = null; private char c; Worm(int i, char x) { System.out.println("Worm Constructor: " i " ,char: " x); c = x; if (--i > 0) { nextWorm = new Worm(i, (char) (x 1)); //指向下一條蟲 } } public String toString() { String s = ":" c "("; for (int i = 0; i < d.length; i ) { s = d[i].toString(); } s = ")"; if (nextWorm != null) { s = nextWorm.toString(); } return s; } }另外以下是輸出結果:(可以看出轉換前和轉回後物件網絡資料成員的值都是一樣的,A-F 那一些數字) Worm Constructor: 6 ,char: A Worm Constructor: 5 ,char: B Worm Constructor: 4 ,char: C Worm Constructor: 3 ,char: D Worm Constructor: 2 ,char: E Worm Constructor: 1 ,char: F w=:A(903):B(428):C(086):D(298):E(500):F(576) sBase64=rO0ABXNyAAdpby5Xb3JtPC8nAJeequsCAANDAAFjWwABZHQACltMaW8vRGF0YTtMAAhuZXh0V29y bXQACUxpby9Xb3JtO3hwAEF1cgAKW0xpby5EYXRhO cKmLWDFe8FAgAAeHAAAAADc3IAB2lvLkRh dGFw3dTg8QoFAgIAAUkAAWl4cAAAAAlzcQB AAYAAAAAc3EAfgAGAAAAA3NxAH4AAABCdXEAfgAE AAAAA3NxAH4ABgAAAARzcQB AAYAAAACc3EAfgAGAAAACHNxAH4AAABDdXEAfgAEAAAAA3NxAH4A BgAAAABzcQB AAYAAAAIc3EAfgAGAAAABnNxAH4AAABEdXEAfgAEAAAAA3NxAH4ABgAAAAJzcQB AAYAAAAJc3EAfgAGAAAACHNxAH4AAABFdXEAfgAEAAAAA3NxAH4ABgAAAAVzcQB AAYAAAAAc3EA fgAGAAAAAHNxAH4AAABGdXEAfgAEAAAAA3NxAH4ABgAAAAVzcQB AAYAAAAHc3EAfgAGAAAABnA= ,Length=538 w2=:A(903):B(428):C(086):D(298):E(500):F(576) JackTasy
------
JackTasy |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |