gpt4 book ai didi

c# - 带有 ProtoBuf.net 的通用序列化器

转载 作者:太空宇宙 更新时间:2023-11-03 14:09:24 25 4
gpt4 key购买 nike

我正在尝试使用 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 并不打算能够以与XmlSerializerDataContractSerializer 有它们无法建模的场景。特别是,protobuf 格式中完全没有元数据(这是它非常有效的部分原因)意味着它只是打算被预先知道数据结构的代码使用——这如果 object 过多,则不可能。

也就是说, 通过 DynamicType=true 提供了一些支持,但目前不会为您提到的字典场景启用。

不过,在大多数情况下,数据并不是真的可以是任何;更典型的是,预期数据类型的数量是有限的。当是这种情况时,对象 问题可以使用稍微不同的模型(特别是非泛型基类型、泛型子-类型,以及一些“包含”选项)。与大多数序列化一样,在某些情况下可能需要一个单独的“DTO”模型,它看起来更接近序列化输出而不是您的域模型。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com