1

我们将数据库表中的 protobufs 保存为 Byte[]s。但是,我们遇到了一种情况,即我们必须在保存 protobuf 后对其进行更新。这会产生两个问题 - (1) 我们必须对它们进行序列化/反序列化以更新它们并将它们保存回来,(2) 我们必须在更新代码中复制 protobuf 层次结构(如果 obj.getType() == typeOf(A )) then ... else (如果 type == ) do ...

有没有办法修改 Byte[] 而无需序列化/反序列化和识别 protobuf 类型?

谢谢马尼什

4

1 回答 1

1

协议缓冲区格式通常用作不透明格式,这意味着:您不会期望知道内部 - 典型的场景您只需加载它,进行更改并保留它。幸运的是,该格式简洁高效,因此这根本不是问题。

作为比较,你不会对BinaryFormatter不使用BinaryFormatter.可以稳健地处理它。

然而!如果你决定在没有序列化器的情况下处理 protobuf 数据,你也可以使用 reader/writer API。这与XmlReader/一样XmlWriter,假设您对底层规范有相当多的了解,并且您仍然需要知道您感兴趣的字段编号(尽管您不需要对您不感兴趣的字段了解很多有兴趣)。

如果您有一个非常具体(即可运行)的示例,我可能会向您展示如何执行此操作。然而!我会建议最简单的事情可能是拥有模型。

但是,我有点不清楚为什么需要“复制 protobuf 层次结构”。Protobuf-net,在默认用法中,一点也不关心实际类型是什么(只要它们符合合同)。如果场景是您正在对 DTO 进行更改,则:

  1. 是的,做一些危险的事情,比如对 DTO 进行重大更改可能会影响事情 - 如果它急躁,请停止这样做(随着时间的推移,通常有同样方便但安全的方法来更改 DTO)
  2. 在许多情况下,您可以使用RuntimeTypeModelv2 的功能来弥补模型的 2 个版本之间的差异 - 通过具有两种不同的RuntimeTypeModel配置(可能其中一种涉及代理,或使用不同的属性等)

不过,我需要查看您要解决的问题以提供进一步的建议。

于 2012-06-07T20:27:48.810 回答