使用ProtoBuf网络快速获取序列化数据长度的方法

本文关键字:数据 方法 序列化 获取 ProtoBuf 网络 使用 | 更新日期: 2023-09-27 18:00:33

假设我有一个Person类。它具有可编辑的Notes属性
我想将Person实例序列化到一个固定大小的缓冲区,因此Notes不能无限长
在UI中,我使用TextBox让用户编辑注释。我想动态更新一个标签,告诉你可以再写多少个字符。

这是我目前的实现方式,有没有更快的方法?(我用的是rs282)

    public Int32 GetSerializedLength()
    {
        Byte[] data;
        using (MemoryStream ms = new MemoryStream())
        {
            Serializer.SerializeWithLengthPrefix<Person>(ms, this, PrefixStyle.Base128);
            data = ms.ToArray();
        }
        using (MemoryStream ms = new MemoryStream(data))
        { 
            Int32 length = 0;
            if (Serializer.TryReadLengthPrefix(ms, PrefixStyle.Base128, out length))
                return length;
            else
                return -1;
        }
    }

编辑:我对序列化数据的内部长度和序列化数据的总长度感到困惑
这是我的最终版本:

    private static MemoryStream _ms = new MemoryStream();
    public static Int64 GetSerializedLength(Person person)
    {
        if(null == person) return 0;
        _ms.SetLength(0);
        Serializer.Serialize<Person>(_ms, person);
        return _ms.Length;
    }

使用ProtoBuf网络快速获取序列化数据长度的方法

在进行编辑时,听起来您希望在不进行序列化的情况下获得长度(因为如果您希望在进行序列化时获得长度,则只需对其进行序列化并检查.Length)。

基本上,没有——这是不可用的。我知道其他一些实现急切地构建这些数据,这在一定程度上是,因为他们一直在构建缓冲数据,其中protobuf-net从对象图中工作。

protobuf-net做到了而不是——它通过在对象图上的一次遍历中发现来构建数据。你心中有什么特定的目的吗?事情总是可以添加的(尽管需要努力)。


关于注释(字符串)字段的问题,您不想过大;作为健全性检查,请注意protubuf使用UTF8或字符串数据,所以个人我只会这样做:

if(theText.Length > MAX || Encoding.UTF8.GetByteCount(theText) > MAX
       || GetSerializedLength(obj) > MAX)
{
        //
}

注意,在

的明显情况下,我们已经以更便宜的价格检查了这一点