2009-07-01 6 views
0

私は、かなりコンパクトな英数字の文字列として約10-15の短い文字列(そして多分いくつかのint)のコレクションを表現する必要があります。これはgetリクエストでパラメータとして送ることができます。コレクションを英数字の文字列としてシリアル化する方法は?

基本的に、私のコレクションはハッシュテーブルになると思っていますが、ビューステート文字列のように見えるようにシリアル化したいと思います。

例えば、 testpage.aspx?= rO0ABXNyAAlTb21lQ2xhc3PSHbLk6OgfswIAA0kAAWl

コード、その後testpage.aspxは、元のコレクションにこのバックをデシリアライズすることができます。

これは可能ですか?

答えて

3

なぜあなただ​​けいるProtobufネットを使用してデータをシリアル化し、セッションを通してそれを通過しませんか?または、文字列でなければならない場合は、XmlSerializerを使用しますか?

個人的には、URLを通じてシリアル化されたデータを渡すことは私には本当に悪いですね!ここ

+0

投票を取得します。 ;-p –

+0

Heh、しかしあなたはBicased Marc;) – GenericTypeTea

+0

本当に... ;-p –

4

1つのオプションは、たとえばユーロのために、区切り文字を選択することです。文字列に参加、彼ら(おそらくUTF8)をコードし、ベース-64としてバイトをパック...

string[] data = {"abc","123", "def"}; 
    string s = string.Join("¤", data); 
    byte[] raw = Encoding.UTF8.GetBytes(s); 
    string alphaNumeric = Convert.ToBase64String(raw); // send this 

(あなたはそのベース64の使用数の英数字以外の文字を処理する必要があるかもしれません)。

そして、それを逆にする:

raw = Convert.FromBase64String(alphaNumeric); 
    s = Encoding.UTF8.GetString(raw); 
    data = s.Split('¤'); 

をキー/値のペアを送信したい場合は...よく、明らか選択は、クエリ文字列になることは、彼ら以来、自分自身をパラメータこれのために設計されています。しかし、あなたバイトストリームとして必要それならば:あなたはちょうどそれが少し見えにくくさせると考えられる使用を解決するために(JSON、 に辞書/ハッシュテーブルをシリアライズして、BASE64に変更することができ

var data = new DbConnectionStringBuilder(); 
    data["foo"] = "abc"; 
    data["bar"] = "123 + ;la"; 
    string s = data.ConnectionString; 

    byte[] raw = Encoding.UTF8.GetBytes(s); 
    string alphaNumeric = Convert.ToBase64String(raw); // send this 

    raw = Convert.FromBase64String(alphaNumeric); 
    s = Encoding.UTF8.GetString(raw); 
    data.ConnectionString = s; 
    foreach (string key in data.Keys) 
    { 
     Console.WriteLine(key + "=" + data[key]); 
    } 
+0

私はDbConnectionStringBuilderを使う考えが好きです。 –

0

URL文字などの)。 または単にURLエンコードすることができます。

0

あなたは、標準の.NETシリアル化を使用してのMemoryStreamに、あなたのオブジェクトをシリアル化することができます。次に、MemoryStreamの内容をバイト配列として読み込み、配列のConvert.ToBase64Stringを使用して文字列表現を取得することができます。あなたが逆の操作を行うことができ、それをデシリアライズする

あなたはシリアライズされたオブジェクトが大きすぎることを心配している場合は、それを圧縮するSystem.IO.Compression.DeflateStreamでのMemoryStreamをラップすることができます。

+0

それはちょうどいくつかの文字列を送信するために余計に思えます - それは完全に移植性がありません...? –

+0

@marc - それは残忍かもしれませんが、彼の質問はあいまいです(...多分いくつかのints)とシリアル化を使用して(おそらく収縮)は、ほとんどの場合に動作する一般的な解決策です。 –

0

は、私がテストコンソールアプリケーションを書いてそれを一緒に入れて、あなたのすべてをありがとうございました。私は結果の文字列がとても長いことに少し失望した。

私の例では、私のデータサイズのため、おそらくそれは圧縮して保存しより多くのオーバーヘッドが発生しDeflateStreamを実装します。しかし圧縮しなくても、それはまだかなり大きかった。

私が達成しようとしていたのは、コンパクトなものをコンパクトにすることでした(ユーザの難読化はプラスでしたが、重要ではありませんでした) - 私は普通のパラメータ化された文字列を使用する方が良いでしょう。おそらくJSONは大丈夫かもしれませんが、私はASP.net 2.0を使用しています。私はreadybaked jsonシリアライザをそこに置くとは思わないでしょう。

それでも、私は何か新しいこと、面白いことを学んだので、ありがとう!

static void Main(string[] args) 
    { 
     Hashtable ht1 = new Hashtable(1); 
     ht1.Add("name", "bob"); 
     Console.WriteLine(ToCompactString(ht1)); 

     Console.WriteLine(); 

     string str = "name:bob"; 
     Console.WriteLine(ToCompactString(str)); 
     Console.ReadLine(); 
    } 

    private static string ToCompactString(object obj) 
    { 
     var ms = new MemoryStream(); 
     var ds = new DeflateStream(ms, CompressionMode.Compress); 
     var bf = new BinaryFormatter(); 

     bf.Serialize(ds, obj); 
     byte[] bytes = ms.ToArray(); 
     ds.Close(); 
     ms.Close(); 
     string result = Convert.ToBase64String(bytes); 
     return result; 
    } 
+0

2番目の方法(DbConnectionStringBuilder、UTF8、ベース64)で、この "name" = "bob"の例は "bmFtZT1ib2I ="です。ちなみに、短いデータの圧縮はしばしば*サイズを増やします...おそらく2つのupvoted答えを試してみたら? –

+0

私はここでMarcに同意します。このソリューションは、おそらく必要以上に複雑なものです。 –

関連する問題