我正在尝试使用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 的对象时,遇到一个错误,告诉我没有为Object注册任何序列化程序。

我确实看过serializing a Dictionary<string,object> in ProtoBuf-net fails,但建议的解决方案似乎需要一些知识,并且需要访问要序列化的对象。

关于如何进行的任何建议?

最佳答案

protobuf-net并未计划能够序列化每个方案(尤其是那些由object主导的方案),其方式与XmlSerializerDataContractSerializer具有无法建模的方案的方式完全相同。特别是,原始数据格式完全缺乏元数据(这是效率很高的部分原因),这意味着仅打算将其供事先知道数据结构的代码使用-如果太多,则不可能object

就是说,通过DynamicType=true有一些支持,但是您提到的字典方案目前无法启用。

但是,在大多数情况下,数据可以是任何东西并不是真正的情况。更通常地,期望的数据类型是有限的。在这种情况下,可以使用稍有不同的模型(特别是非通用基类型,通用子类型和一些“包含”选项)以更简洁的方式解决object问题。与大多数序列化一样,在某些情况下可能需要一个单独的“ DTO”模型,该模型看起来更像是序列化输出而不是域模型。

最后一点:GetProperties()/ Add()方法不可靠,因为GetProperties()不保证成员的任何特定顺序。使用protobuf-net进行显示时,顺序很重要,因为这有助于确定要使用的密钥。即使顺序是固定的(例如,按字母顺序排序),也请注意,添加成员可能是一个重大更改。

关于c# - 具有ProtoBuf.net的通用序列化器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8291382/

10-17 00:48