c# - 使用 ProtoBuf-net 快速获取序列化数据长度的方法?

标签 c# protobuf-net

假设我有一个 Person 类。它有一个可编辑的注释属性。
我想将 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;
    }

最佳答案

经过编辑,听起来您想要的长度没有序列化(因为如果您想要长度序列化,您只需序列化它并检查.Length).

基本上,不 - 这不可用。我知道其他一些实现会急切地构建此数据,部分 因为它们一直在构建缓冲数据,而 protobuf-net 从对象图中工作。

protobuf-net 不会这样做 - 它在单次遍历对象图期间通过发现构建数据。你有什么特定的目的吗?事情总是可以添加的(尽管需要付出努力)。


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

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

请注意,我们已经在明显的情况下以更便宜的方式检查了这一点

关于c# - 使用 ProtoBuf-net 快速获取序列化数据长度的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474124/

相关文章:

protocols - 必须为现有的 proto 包含 Map 创建 java pojo

C# 在特定时间执行函数

visual-studio - 在 Visual Studio/Rider 中使用 proto 文件中的导入

c# - 通过序列化对象列表来奇怪的 Protobuf 加速

c# - Grpc.Core.RpcException "Failed to deserialize response message.."或 "InvalidOperationException: Length mismatch"

c# - 用于在 UI 和 C 代码之间进行消息传递的套接字?

c# - 如何通过.resources.dll停止扫描

c# - 将 double 更改为 string 后的字符串格式

c# - C# 中的 Java System.currentTimeMillis() 等效项

java - Protobuf如何多次接收字符串和对象