我正在尝试使用protobuf.net v2编写通用序列化程序。然而,我遇到了一些让我想知道我正在做什么的问题是不可能的。要序列化的对象属于我无法访问的不确定类型,所以我试图遍历对象并将其属性添加到类型模型中。
var model = TypeModel.Create();
List<string> propertiesToSerialize = new List<string>();
foreach (var property in typeToSerialize.GetProperties())
{
propertiesToSerialize.Add(property.Name);
}
model.AutoAddMissingTypes = true;
model.Add(typeToSerialize, true).Add(propertiesToSerialize.ToArray());
对于仅包含基元的简单对象,这似乎工作得很好。但是,在处理包含Dictionary&lt; string,object&gt;的对象时我遇到一个错误,告诉我没有为Object注册序列化程序。
我确实看过serializing a Dictionary<string,object> in ProtoBuf-net fails但似乎建议的解决方案需要一些知识并且可以访问被序列化的对象。
有关我如何进行的任何建议?
答案 0 :(得分:1)
protobuf-net 未列出能够序列化每个方案(尤其是那些由object
支配的方案),其方式与XmlSerializer
和{{完全相同1}}有他们无法建模的场景。特别是,protobuf格式中完全缺少元数据(为什么它非常有效)的一部分意味着它只是意图被预先知道数据结构的代码所使用 - 如果DataContractSerializer
太多,则无法实现。
也就是说, 通过object
提供了一些支持,但目前无法为您提及的字典方案启用。
但在大多数情况下,数据实际上不是任何;更典型地,存在有限数量的预期数据类型。当 是这种情况时,DynamicType=true
问题可以使用稍微不同的模型以更干净的方式解决(具体而言,非通用基类型,通用子类型,以及一些“包含”选项)。与大多数序列化一样,有些情况可能需要单独的“DTO”模型,它看起来更接近序列化输出而不是域模型。
最后一点:GetProperties()/ Add()方法不健全,因为GetProperties()不保证成员的任何特定顺序;在你展示的方式中使用protobuf-net,顺序非常重要,因为这有助于确定要使用的密钥。即使订单 已修复(例如按字母顺序排序),请注意添加成员可能是一个重大变化。