使用 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 的前提是知道你在序列化/反序列化什么你做之前,如果你只知道objectIComparable,这是不可能的。

我上周在a GitHub issue here 中更详细地谈到了这种情况,包括关于如果是我将如何表示这种情况的建议,这实际上归结为“作为我期望的实际类型的有区别的联合”。我还将创建一个单独的 DTO 模型,并将 that 序列化,而不是尝试序列化我预先存在的类型 - 然后在它们之间进行映射。

【讨论】:

非常感谢您的回答,我会尽量想出最不痛苦的方式来重构我的代码 :) 这是我试图尽可能少接触的遗留问题,但序列化使用标准二进制序列化程序处理大量数据占用了太多时间......

以上是关于使用 protobuf-net 序列化 List<IComparable> 成员的主要内容,如果未能解决你的问题,请参考以下文章

使用 protobuf-net 反序列化不同的列表

为啥我的 List<Foo> 不能用 protobuf-net 序列化?

Protobuf-Net 总是反序列化一个空列表

protobuf-net 中通用集合的序列化

使用 Protobuf-net 序列化可空双精度列表的问题

Protobuf-Net 空列表