1

我意识到这里有类似的问题,但没有一个问题像我需要的那样直截了当,可能是因为我缺乏 protobuf 经验。我正在为 enyim 的缓存客户端进行代码转换,并且无法弄清楚如何创建一个既派生又实现接口反序列化的类。

对于这样的样本

public class BaseClass
{
}

public interface ISomeRules
{
}

public class DerivedClass : BaseClass, ISomeRules
{
}

public class ThirdClass
{
    ISomeRules ruleUser;
}

我想做这样的事情,因为我通常在任何地方都使用属性

[ProtoContract
,ProtoInclude(101,typeof(DerivedClass))
]
public class BaseClass
{
}

[ProtoContract
,ProtoInclude(102,typeof(DerivedClass))
]
public interface ISomeRules
{
}

[ProtoContract]
public class DerivedClass : BaseClass, ISomeRules
{
}

[ProtoContract]
public class ThirdClass
{
    [ProtoMember(1)]
    ISomeRules ruleUser;
}

但它无法静默缓存。如果像某些人建议的那样,我ProtoContract从 中删除该属性ISomeRules,则反序列化将失败。

使用 protobuf-net 是否可行?这样做的正确方法是什么?我应该使用 TypeModel (我不掌握,但哪些简单的测试表明有同样的问题)来代替?还是 TypeModel 和属性的组合?

4

1 回答 1

4

protobuf-net 中的接口支持适用于有限的场景,您基本上是在使用基于接口的模型,特别是对于嵌套成员。例如:

[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public IBar Bar {get;set;}
}

在上面,我们希望能够序列化Bar,但我们可能对此了解不多。事实上,如果Foo保证从 中返回一个非空值Bar,protobuf-net 甚至不需要知道任何关于具体类型等的信息——它可以继续并填充给定的对象。

在您的示例中,根对象无疑是BaseClass. 我建议这是辅助性的,根本ISomeRules不需要在模型中提及。但是,如果您填充通过 公开的成员,那么您可以尝试(未经测试):ISomeRules

[ProtoMember(n)]
private ISomeRules Rules { get { return this; } }

然后,这会公开ISomeRules信息,但会将其欺骗为子对象。至少值得一试;p

于 2013-01-17T20:18:23.037 回答