c# - 如何使用 Protobuf-Net 序列化接口(interface)对象的集合

标签 c# serialization protobuf-net

我有以下类定义:

[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/

相关文章:

c# - 从 Thread.Start() 的委托(delegate)函数访问返回值

c# - 如何正确关闭在线程中打开的 TcpClient

c# - Lambda表达式访问一个对象的属性,该属性是c#中另一个对象的属性

java - Struts2 portlet NotSerialized 异常

python - 如何将文本文件的内容顺序保存为json格式的列表(不是串联)

c# - protobuf-net - 从 .proto 生成的类 - 重复字段是否应该是只读的,没有 setter ?

c# - 如何从大文本中提取匹配字符串?

c# - 为什么我不能在 .NET asmx Web 服务中公开接口(interface)?

visual-studio - 在 Visual Studio/Rider 中使用 proto 文件中的导入

c# - ProtoBuf.NET - 选择要在运行时加载的字段