将对象序列化为最小的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字节,序列化/反序列化更慢。也许我只能在属性上使用它而不是在整个类上?

将对象序列化为最小的UTF8兼容大小

嗯,base128并不难,如果你知道base64是如何完成的。荷兰语维基百科很好地描述了这个过程(为您翻译):

  1. 将数据转换为二进制
  2. 保持7位块(2^7 = 128)
  3. 将这7位转换成整数
  4. 在您定义的翻译表中查找该整数,并将找到的字符附加到base128字符串中。

翻译表包含128个兼容的UTF8字符,例如:

0: a
1: b
..
25: z
26: 0

唯一的要求是翻译表在发送方和接收方都是相同的

尝试使用objectstateformatter而不是BinaryFormatter,可能会给您更小的大小。这完全取决于你序列化的数据