有没有办法将 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
的类型,您可以设置在反序列化之前执行的继承类型。例如,这适用于 IEnumerable
和 List
:
[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