将protobuf-net流转换为base64是否会取消protobuf的性能和大小优势?



我刚刚开始使用protobuf库对一些开销较大的查询进行永久全局缓存。我将其存储在MSSQL中的文本字段和MSAccess中的memo字段中,并将其扩展到Sqlite中,所以除非我不得不使用二进制字段,否则我不愿意使用二进制字段——我认为字符串操作将比二进制更好地跨db工作。似乎ToBase64String步骤取消了protobuf的各种好处(大小,速度,内存使用)。

public void StoreInDb(T dataPoints, string parameters, string queryName)
{
    //Store in cache
    MemoryStream stream = new MemoryStream();
    Serializer.Serialize(stream, dataPoints);
    byte[] data = new byte[stream.Length];
    stream.Seek(0, SeekOrigin.Begin);
    stream.Read(data, 0, data.Length);
    string output = Convert.ToBase64String(data); //Meh, not pretty
    using (CacheInsert inserter = new CacheInsert())
    {
        inserter.Insert(parameters, output, DateTime.Now.AddDays(1), queryName);
    }
}

有什么建议,如何更好,更快,更便宜?

您可以使用:

来避免数据的重复
string base64 = Convert.ToBase64String(
       stream.GetBuffer(), 0, (int)stream.Length);

base-64增加了一个小的开销,但通常应该没问题。如果您的字符串数据类型是UTF-16,请注意,它当然会再次将大小加倍。

我会尝试以二进制格式存储数据,并且只退回到不允许二进制数据类型(如果实际上有的话)的字符串存储。然而,如果你必须转换为base-64字符串,你不会取消protobuf的所有好处;与将原始数据转换为base64相比,结果仍然更加压缩。

最新更新