将对象序列化为最小的UTF8兼容大小
本文关键字:UTF8 序列化 对象 | 更新日期: 2023-09-27 17:53:03
我有一个非常简单的类,其中包含一些基本类型和一些主要是枚举的集合。现在我需要将这个对象序列化为UTF8兼容的尽可能小的大小。
这是我需要序列化的类
public class Context
{
public Hashtable UserModuleRoles { get; set; }
public Dictionary<string, object> CustomSettings { get; set; }
public int Uid { get; set; }
public int Id { get; set; }
public int ActiveId { get; set; }
public byte Default { get; set; }
public SetEnum Ident { get; set; }
public string Name { get; set; }
public sbyte State { get; set; }
public DateTime Date { get; set; }
}
.
这就是我序列化对象 的方式public string Serialize(object serializeObject)
{
MemoryStream stream = new MemoryStream();
BinaryFormatter b = new BinaryFormatter();
b.Serialize(stream, serializeObject);
byte[] data = stream.ToArray();
stream.Dispose();
stream = new MemoryStream();
using (ZipFile zip = new ZipFile())
{
zip.AddEntry("data", data);
zip.Save(stream);
}
data = stream.ToArray();
stream.Dispose();
return Convert.ToBase64String(data);
}
在我的第一次尝试中,我序列化对象,压缩该内容(大约小1/3)并将其转换为base64字符串。但是base64有相当大的开销1/3,我知道有base128,但我不知道如何开始,我搜索base128编码是不成功的。
或者有其他方法可以做到这一点吗?
如果不是,最好的方法是什么
这是base128吗?
我用整个"Context"对象测试了ObjectStateFormatter类,结果多了8字节,序列化/反序列化更慢。也许我只能在属性上使用它而不是在整个类上?
嗯,base128并不难,如果你知道base64是如何完成的。荷兰语维基百科很好地描述了这个过程(为您翻译):
- 将数据转换为二进制
- 保持7位块(2^7 = 128)
- 将这7位转换成整数
- 在您定义的翻译表中查找该整数,并将找到的字符附加到base128字符串中。
翻译表包含128个兼容的UTF8字符,例如:
0: a
1: b
..
25: z
26: 0
唯一的要求是翻译表在发送方和接收方都是相同的
尝试使用objectstateformatter
而不是BinaryFormatter
,可能会给您更小的大小。这完全取决于你序列化的数据