【问题标题】:Serialize a object to the smallest UTF8 compatible size将对象序列化为最小的 UTF8 兼容大小
【发布时间】:2011-04-27 09:23:47
【问题描述】:

我有一个非常简单的类,它包含一些原始类型和一些主要是枚举的集合。现在我需要将此对象序列化为与 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?

编辑:

我用整个“上下文”对象测试了 ObjectStateFormatter 类,这导致了 8 字节更多和更慢的序列化/反序列化。也许我必须只在属性而不是整个类上使用它?

【问题讨论】:

  • “UTF-8 兼容”是什么意思?
  • 结果将存储在 cookie 中,据我所知 UTF-8 是这里的标准

标签: c# serialization utf-8


【解决方案1】:

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

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

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

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

唯一的要求是发送方和接收方的转换表相同。

【讨论】:

  • 谢谢!在这种情况下,这将对我有所帮助。但是,如果它是最好的解决方案还是有更好的解决方案,仍然存在问题。
  • 我们无法告诉您这是否是您没有给予我们足够的“最佳解决方案”。
  • 好的,我已经发布了序列化方法的代码和要序列化的类。我不知道你还有什么意思。
【解决方案2】:

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

【讨论】:

  • 好的,我明天试一试,对比一下大小。最大的部分将是仅包含枚举的哈希表。或者也许不是最大的,而是价值最高的部分。
  • 好的,最后我测试了一下。在我的简单测试中,它大约比普通字节流大 8 个字节,而且速度要慢得多。根据 msdn,我不知道为什么,因为对象中的所有数据类型都与 objectstateformatter 类完全兼容。如果我只序列化值而不序列化对象中的任何内容,也许我会得到更好的结果。但随后我将在超过十个单流中结束,并且......不,这对我来说听起来不太好。还是我在测试中遗漏了什么?
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多