有没有办法将 IReadOnlyCollection<T>/IReadOnlyList<T> 与 protobuf-net 一起使用

Posted

技术标签:

【中文标题】有没有办法将 IReadOnlyCollection<T>/IReadOnlyList<T> 与 protobuf-net 一起使用【英文标题】:Is there a way to use IReadOnlyCollection<T>/IReadOnlyList<T> with protobuf-net 【发布时间】:2015-05-31 12:49:57 【问题描述】:

我收集到,在使用集合时,protobuf-net 需要 GetEnumerator 进行序列化,并使用带有 Add 的类型进行反序列化。

对于没有Add 的类型,您可以设置在反序列化之前执行的继承类型。例如,这适用于 IEnumerableList

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Sheep

    public IEnumerable<string> Children  get; set; 
    public Sheep()
    
        Children = new List<string>();
    

var dolly = RuntimeTypeModel.Default.DeepClone(new Sheep

    Children = new[]
    
        "Bonnie",
        "Sally",
        "Rosie",
        "Lucy",
        "Darcy",
        "Cotton"
    
);

但是,当我对IReadOnlyCollection(或IReadOnlyList)做同样的事情时:

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Sheep

    public IReadOnlyCollection<string> Children  get; set; 
    public Sheep()
    
        Children = new List<string>();
    

我得到一个例外:

无法为 System.Collections.Generic.IReadOnlyCollection`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 解析合适的 Add 方法]

那么,有没有办法让 protobuf-net 处理 IReadOnlyCollection/IReadOnlyList 的成员?


编辑:我已经在项目的存储库中为此功能打开了一个问题:Support IReadOnlyCollection/IReadOnlyList members

【问题讨论】:

您使用的是哪个 protobuf 库?马克的那个? @YuvalItzchakov 是的,protobuf-net。 Skeet 是 protobuf-csharp-port。 【参考方案1】:

这里的主要问题是“合并”。对于非合并(或者基本上:启用列表替换),我们可能可以硬编码一个具体的类型和策略,但是,对于合并没有明显的事情要做。

目前这种情况没有魔法;任何解决方案都需要更改库。

【讨论】:

“合并”是指添加到现有集合吗?如果是这样,与IEnumerable 是否存在相同的问题,当您在反序列化之前设置List 时它会在哪里起作用? @i3arnon 这就是为什么它需要一个 Add 方法;在那种情况下,它只是调用 Add - 这里不是一个选项 抱歉,我不明白这两种情况的区别,因为Add 都是在List 上执行的。 @i3arnon 确实如此,但这是作为特定的硬编码场景实现的(并且 List-T 提供了 Add);这种情况目前不存在这种特殊情况,即使有,也会更复杂(无添加)

以上是关于有没有办法将 IReadOnlyCollection<T>/IReadOnlyList<T> 与 protobuf-net 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将 QVariant 与 QVector 一起使用?

有没有办法将 QTableView 模型转换为 QStandardItemModel

有没有办法将数字单词转换为整数?

NSManagedObject 有没有办法将创建的子类导入 xcdatamodel 文件

有没有办法使用 VueJs 将列表分成列?

Symfony - 有没有办法将实体设置为全局?