全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1087
推到 Plurk!
推到 Facebook!

物件轉成字串再還原,對於物件網絡問題的實驗結果分享

 
JackTasy
初階會員


發表:22
回覆:97
積分:28
註冊:2002-06-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-06 12:55:53 IP:211.76.xxx.xxx 未訂閱
大家好,之前小弟一直在找尋模擬 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
系統時間:2024-05-08 20:10:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!