我有以下类定义:
[ProtoInclude(2, typeof(Foo))]
public interface IFoo
{
double Bar { get; }
}
[ProtoContract]
public class Foo : IFoo
{
[ProtoMember(1)]
private double _bar
{
get { return Bar / 10; }
set { Bar = 10 * value; }
}
public double Bar { get; private set; }
}
[ProtoContract]
public class MyClass
{
[ProtoMember(1, OverwriteList = true)]
public IReadOnlyList<IFoo> Foos { get; private set; }
}
当我尝试使用 protobuf-net 序列化 MyClass 对象时,出现异常:
System.InvalidOperationException : It was not possible to prepare a serializer for: MyNamespace.MyClass ----> System.InvalidOperationException : No serializer defined for type: MyNamespace.IFoo
在我的例子中,我知道存储在 MyClass.Foos 中的项目的具体类型是 Foo。我如何告诉 protobuf 在它看到类型 IFoo 的任何地方使用类型 Foo?或者,如何让它包含 Foo 作为可用于在集合中实现 IFoo 的类之一?
-- 编辑 --
Sam 的回答非常接近,以至于它揭示了这种方法的另一个问题。即,it is not possible to serialize a property of type IReadOnlyList<T> using protobuf-net .但是,有一个简单的解决方法,因为列表是在 MyClass 的构造函数中创建的。因此,MyClass 可以更改为以下内容:
[ProtoContract]
public class MyClass
{
[ProtoMember(1, OverwriteList = true)]
private List<IFoo> MutableFoos { get; set; }
public IReadOnlyList<IFoo> Foos
{
get { return MutableFoos; }
}
}
但是,MyClass 的序列化仍然失败并显示消息“System.InvalidOperationException:没有找到适合代理项的转换运算符:MyNamespace.IFoo/MyNamespace.Foo” .
最佳答案
在序列化成员中使用接口(interface)类的地方,我永远无法使它正常工作。相反,我最终不得不将具体类作为列表成员类型。以下是最终对我有用的:
[ProtoContract]
public class MyClass
{
[ProtoMember(1, OverwriteList = true)]
private List<Foo> MutableFoos { get; set; }
public IReadOnlyList<IFoo> Foos
{
get { return MutableFoos; }
}
}
注意序列化成员中的类型是 List<Foo>
, 而不是 List<IFoo>
.我从来不知道如何让后者工作。
关于c# - 如何使用 Protobuf-Net 序列化接口(interface)对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31304674/