序列化后更新protobuf

时间:2012-06-07 19:40:39

标签: protobuf-net

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

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

由于 和Manish

1 个答案:

答案 0 :(得分:1)

协议缓冲区格式通常用作不透明格式,这意味着:您不希望知道内部 - 您只需加载的典型方案 它,做出你的改变,坚持下去。幸运的是,这种格式简洁而有效,因此这根本不是问题。

作为比较,您不会期望在不使用BinaryFormatter的情况下编辑BinaryFormatter数据,并且大多数人仍然会使用序列化程序对xml / json进行更改,因为格式是足够复杂,不值得尝试编写可以强有力地处理它的vanilla代码。

然而!如果确定在没有序列化程序的情况下处理protobuf数据,您还可以使用读取器/写入器API。这与XmlReader / XmlWriter一样,假设您对基础规范有很多了解,并且您仍然需要知道您感兴趣的字段编号(尽管您不需要了解你感兴趣的领域。

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

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

  1. 是的,做一些危险的事情,比如对DTO进行重大改变可能会影响事情 - 如果它突然出现,停止这样做(通常有同样方便但安全的方式来改变DTO)< / LI>
  2. 在许多情况下,您可以使用v2的RuntimeTypeModel功能来重新模拟两个版本的模型之间的差异 - 通过两个不同的RuntimeTypeModel配置(可能其中一个涉及代理,或使用不同的属性等)
  3. 我需要看到你想要解决的问题,以便进一步提出建议。