【发布时间】:2015-04-14 20:16:44
【问题描述】:
我有一个如下所示的自定义集合:
class SpecialReadOnlyCollection<T> : IReadOnlyCollection<T>{
private readonly List<T> entries;
public SpecialReadOnlyCollection(IEnumerable<T> source){
entries = new List<T>(source);
}
...
}
这(除其他外)包装了一个列表,但不提供Add 方法。
现在我还有另外两个课程:
class A{
public string Name;
public int Value;
}
class ContainerOfA{
public SpecialReadOnlyCollection<A> list;
public ContainerOfA(IEnumerable<A> source){
this.list = new SpecialReadOnlyCollection<A>(source);
}
}
我想序列化一个ContainerOfA。由于我不喜欢属性,这就是我构建模型并尝试序列化的方式。
// Make A serializable
var metaType = Model.Add(typeof(A),true);
metaType.AddField(1,"Name");
metaType.AddField(2,"Value");
metaType.UseConstructor = false;
// Make SpecialCollection serializable
Model.Add(typeof(SpecialReadOnlyCollection<A>),true).AddField(1,"entries");
Model[typeof(SpecialReadOnlyCollection<A>)].IgnoreListHandling = true;
Model[typeof(SpecialReadOnlyCollection<A>)].UseConstructor = false;
// Make container serializable
Model.Add(typeof(ContainerOfA),true).AddField(1,"list");
Model[typeof(ContainerOfA)].UseConstructor = false;
// Initialize the container
A a = new A{Name ="Name", Value =1};
A[] arr = {a};
var container = new ContainerOfA(arr);
// Try and serialize ....
Model.DeepClone(container);
但是,当我尝试序列化时,出现异常:
Unable to resolve a suitable Add method for SpecialReadOnlyCollection[A]
我觉得奇怪的是,如果我尝试仅序列化列表,它工作正常:
Model.DeepClone(container.list);
如果我不是在代码中使用属性构建模型,那么一切都可以正常工作。事实上,如果我只在 ContainerOfA 中使用属性并通过代码使 A 和 SpecialReadOnlyCollection 可序列化,那么一切正常。
我做错了什么吗?我怎样才能解决这个问题? (可能最简单的答案是使用属性......但我真的想避免使用属性)。
tl;dr:如何通过 RuntimeTypeModel 使用 protobuf-net 序列化一个具有不应被视为列表 (IgnoreListHandling = true) 作为成员的 IEnumerable 成员的类。
【问题讨论】:
标签: c# serialization protobuf-net