使用 protobuf-net 序列化 List<IComparable> 成员
Posted
技术标签:
【中文标题】使用 protobuf-net 序列化 List<IComparable> 成员【英文标题】:Serializing a List<IComparable> member with protobuf-net 【发布时间】:2020-10-02 09:53:26 【问题描述】:我正在尝试使用protobuf-net
序列化现有的遗留类:
using ProtoBuf;
using System;
using System.Collections.Generic;
[ProtoContract]
public class AttributeValue
List<IComparable> attributeValues;
[ProtoMember(1)]
public List<IComparable> Values
get
return this.attributeValues;
我得到一个例外说No serializer for type System.IComparable is available for model (default)
。
查看一些示例,我发现应该在 ProtoMember
属性中添加 DynamicType = true
属性,但现在已弃用。
有没有另一种方法来序列化和反序列化具有这样声明的成员的类?
【问题讨论】:
我认为您应该在指定可能的具体类型时使用ProtoInclude
属性。
我试过了,但是ProtoInclude
属性不能用于成员,只能用于类。
【参考方案1】:
不,从根本上说。 Protobuf 的前提是知道你在序列化/反序列化什么在你做之前,如果你只知道object
或IComparable
,这是不可能的。
我上周在a GitHub issue here 中更详细地谈到了这种情况,包括关于如果是我将如何表示这种情况的建议,这实际上归结为“作为我期望的实际类型的有区别的联合”。我还将创建一个单独的 DTO 模型,并将 that 序列化,而不是尝试序列化我预先存在的类型 - 然后在它们之间进行映射。
【讨论】:
非常感谢您的回答,我会尽量想出最不痛苦的方式来重构我的代码 :) 这是我试图尽可能少接触的遗留问题,但序列化使用标准二进制序列化程序处理大量数据占用了太多时间......以上是关于使用 protobuf-net 序列化 List<IComparable> 成员的主要内容,如果未能解决你的问题,请参考以下文章