gpt4 book ai didi

c# - 有没有办法标记每个 protobuf-net 记录的结尾

转载 作者:太空狗 更新时间:2023-10-30 01:08:04 37 4
gpt4 key购买 nike

我将数据库单元格中的一系列 protobuf-net 对象保存为长度前缀 protobuf-net 对象的 Byte[]:

//retrieve existing protobufs from database and convert to Byte[]
object q = sql_agent_cmd.ExecuteScalar();
older-pbfs = (Byte[])q;

// serialize the new pbf to add into MemoryStream m
//now write p and the new pbf-net Byte[] into a memory stream and retrieve the sum

var s = new System.IO.MemoryStream();
s.Write(older-pbfs, 0, older-pbfs.Length);
s.Write(m.GetBuffer(), 0, m.ToArray().Length); // append new bytes at the end of old
Byte[] sum-pbfs = s.ToArray();

//sum-pbfs = old pbfs + new pbf. Insert sum-pbfs into database

这很好用。我担心的是如果有轻微的数据库损坏会发生什么。将不再可能知道哪个字节是长度前缀,并且必须丢弃整个单元格内容。是否也建议使用某种 pbf 对象结束指示符(有点像文本文件中使用的\n 或 EOF 指示符)。这样即使一条记录损坏,其他记录也可以恢复。

如果是这样,在每个 pbf 末尾添加记录结束指示符的推荐方法是什么。

在 Visual Studio 2010 上使用 protobuf-netv2 和 C#。

谢谢马尼什

最佳答案

如果您通过 Serialize/Deserialize 使用原始消息,则否:这不是规范的一部分(因为格式被设计为可附加的)。

但是,如果您使用 SerializeWithLengthPrefix,它将在消息的开头转储长度;然后它会提前知道需要多少数据。你用DeserializeWithLengthPrefix反序列化,如果没有足够的数据,它会大声提示。然而!如果您有额外数据,它不会提示,因为这也是被设计成可追加的。

就 Jon 的回复而言,*WithLengthPrefix 方法的默认用法就存储的数据而言与 Jon 的建议完全相同;它假装有一个包装器对象并相应地表现。不同之处在于:

  • 实际上不存在包装器对象
  • “withlengthprefix”方法在单次出现后明确停止,而不是将以后的任何数据合并到同一对象中(例如,用于将多个离散对象发送到单个文件或通过单个套接字发送)

这里两个“appendable”的区别在于,第一个表示“合并到一个对象中”,而第二个表示“我希望有多个记录”。

不相关的建议:

s.Write(m.GetBuffer(), 0, m.ToArray().Length);

应该是:

s.Write(m.GetBuffer(), 0, (int)m.Length);

(无需创建额外的缓冲区)

关于c# - 有没有办法标记每个 protobuf-net 记录的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607103/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com