POCO(de)序列化如何在protobuf-net中运行?

时间:2011-06-02 08:17:25

标签: .net protobuf-net

是否可以使用protobuf-net属性(de)序列化POCO类型,也不可能明确地将类型添加到模型中?

3 个答案:

答案 0 :(得分:1)

目前 - 简而言之,没有。它需要基本了解您打算如何操作。我想也许我可以添加一些内容,让你为完全朴素的类型(非DataContractProtoContractXmlType)指定默认策略,但最合适的选择是“所有公共成员”(很像XmlSerializer)。

我不想鼓励这一点的原因是它很脆弱。由于protobuf规范是如何定义的,所以你得到的只是字段数。很容易说“好吧,按字母顺序排序并使用他们的位置”,但如果您想要更改类型,这是不安全的。让我们面对现实,我们都这样做。你会惊奇地发现我经常添加一个AardvarkCount属性,这个属性会按字母顺序排列。

因此,我不想让人们容易进入他们冒数据完整性风险的位置。因为我不喜欢别人对我大喊大叫。如果存在全局默认策略,则很容易使用该策略而不会意识到,这就是您开始遇到麻烦的时候。

但是,我确实打算让每个类型更容易选择这些策略(代码全部存在,它不在公共API中) - 例如:

model.Add(typeof(MyCrazyType), false).ApplyPolicy(ImplicitFields.AllPublic);

ImplicitFields内容已经存在,回到v1天)或者只是:

model.Add(typeof(MyCrazyType), ImplicitFields.AllPublic);

任何帮助?推理有意义吗?

答案 1 :(得分:1)

我对此表示怀疑。它将用于属性的整数id是什么?

您当然可以编写一些基于反射的代码,将类型添加到模型中,而无需手动指定配置。但是我想你在添加/删除类型属性时会遇到版本问题。因为我认为没有办法隐式地创建从字符串到整数的稳定映射。

您可能还可以在protobuf中定义一些键值格式,这样您就可以使用字符串键而不是整数键。但是你失去了protobuf提供的优势。而你可以改用json / bson。

答案 2 :(得分:0)

CodeInChaos所说的是真实的,关于模型更改可能会破坏事物,但对于更简单的项目或模型稳定的地方,您可以有效地做到这一点。方法如下:https://github.com/danielcrenna/protobuf-poco