gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:43:11 26 4
gpt4 key购买 nike

我有以下类定义:

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com