协议缓冲区格式通常用作不透明格式,这意味着:您不会期望知道内部 - 典型的场景是您只需加载它,进行更改并保留它。幸运的是,该格式简洁高效,因此这根本不是问题。
作为比较,你不会对BinaryFormatter
不使用BinaryFormatter
.可以稳健地处理它。
然而!如果你决定在没有序列化器的情况下处理 protobuf 数据,你也可以使用 reader/writer API。这与XmlReader
/一样XmlWriter
,假设您对底层规范有相当多的了解,并且您仍然需要知道您感兴趣的字段编号(尽管您不需要对您不感兴趣的字段了解很多有兴趣)。
如果您有一个非常具体(即可运行)的示例,我可能会向您展示如何执行此操作。然而!我会建议最简单的事情可能是拥有模型。
但是,我有点不清楚为什么需要“复制 protobuf 层次结构”。Protobuf-net,在默认用法中,一点也不关心实际类型是什么(只要它们符合合同)。如果场景是您正在对 DTO 进行更改,则:
- 是的,做一些危险的事情,比如对 DTO 进行重大更改可能会影响事情 - 如果它急躁,请停止这样做(随着时间的推移,通常有同样方便但安全的方法来更改 DTO)
- 在许多情况下,您可以使用
RuntimeTypeModel
v2 的功能来弥补模型的 2 个版本之间的差异 - 通过具有两种不同的RuntimeTypeModel
配置(可能其中一种涉及代理,或使用不同的属性等)
不过,我需要查看您要解决的问题以提供进一步的建议。