我需要将一个大约10-15个短字符串(可能还有一些整数)的集合表示为一个相当紧凑的字母数字字符串 - 我可以在get请求中将其作为参数发送。
基本上,我认为我的集合将是一个哈希表,我想将它序列化,使它看起来有点像一个视图状态字符串(希望不会那么长!)。
例如。 testpage.aspx?代码= rO0ABXNyAAlTb21lQ2xhc3PSHbLk6OgfswIAA0kAAWl
然后testpage.aspx可以将其反序列化回原始集合。
这可能吗?
答案 0 :(得分:4)
这里的一个选择是选择一个分隔符,例如¤;加入字符串,对它们进行编码(可能是UTF8),并将字节打包为base-64 ...
string[] data = {"abc","123", "def"};
string s = string.Join("¤", data);
byte[] raw = Encoding.UTF8.GetBytes(s);
string alphaNumeric = Convert.ToBase64String(raw); // send this
(您可能需要处理base-64使用的少数非字母数字字符。)
要扭转它:
raw = Convert.FromBase64String(alphaNumeric);
s = Encoding.UTF8.GetString(raw);
data = s.Split('¤');
如果你想发送键/值对......那么 明显的 选项本身就是查询字符串参数,因为它们是为此而设计的。但如果您需要它作为字节流:
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]);
}
答案 1 :(得分:3)
为什么不用protobuf-net序列化数据并将其传递给Session?或者,如果它必须是一个字符串,只需使用XmlSerializer?
就个人而言,通过URL传递序列化数据对我来说真的很糟糕!
答案 2 :(得分:0)
你可以将你的字典/哈希表序列化为JSON, 然后将其更改为base64(只是为了让它变得不那么明显并解决URL字符的可能用法等)。 或者你可以对URLEncode进行编码。
答案 3 :(得分:0)
您可以使用标准.Net序列化并将对象序列化为MemoryStream。然后,您可以将MemoryStream的内容作为字节数组读出,并使用数组上的Convert.ToBase64String来获取它的字符串表示形式。
要反序列化,你可以做相反的事情。
如果您担心序列化对象太大,可以将MemoryStream包装在System.IO.Compression.DeflateStream中以压缩它。
答案 4 :(得分:0)
谢谢大家,把它放在一起我写了一个测试控制台应用程序。我有点失望,因为结果字符串很长。
我的示例实现了一个DeflateStream,对于我的datasize可能会引入比压缩保存更多的开销。但即使没有压缩,它仍然很大。
我希望实现的是使某些东西更加紧凑(对用户进行混淆是一个加分,但并不重要) - 我怀疑使用普通的旧参数化字符串实际上更好。也许JSON可能没问题,但我使用的是ASP.net 2.0,我认为我没有在那里得到一个现成的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;
}