2010-08-19 56 views
1

这个问题直接在很大程度上是protobuf-net维护者的问题,但其他人请评论。protobuf-net和接口支持

我试图序列化包含有一个接口类型的属性的一类,即:

[DataContract]  
public class SampleDataClass 
{ 
    [DataMember(Order=1)] 
    public int Field1 { get; set; }     

    [DataMember(Order = 2)]   
    public IPayload Payload { get; set; } 
} 

[ProtoContract] 
[ProtoInclude(1, typeof(Payload))] 
public interface IPayload 
{ 
    int Field4 { get; set; } 
} 

[DataContract] 
public class Payload : IPayload 
{ 
    [DataMember(Order = 1)] 
    public int Field4 { get; set; } 
} 

我设法得到这种通过改变protobuf网的V1的源工作。 只要为接口定义了ProtoInclude,我就没有看到这种方法存在任何问题。

显然,为了编译我必须让ProtoContract和ProtoInclude在界面上进行修饰,再加上其他一些更改。 (注意,我将使用DataContract/KnownType,但是这些属性也无法在界面上进行修饰)

请问您可以对可能的缺点发表评论吗?

+0

这款刚刚V2的标准功能致力于v2中继线,顺便说一句 – 2011-05-24 23:32:07

回答

2

我可以看到的主要问题是,在有效负载方面,这会将数据移动到子消息中。我对v2有一些类似的设计,希望能够解决这个问题,并保留主要信息中的大部分值。出于理智的原因,我主要针对这一变化考虑了v2(因为两个实现将是分开的,而v2有更好的类型模型)。

但是,应该可以支持这两种使用模式。如果你想送它作为第一版补丁(使用相同的许可证等),我会高兴地看看:)


这是作为

+0

你可以进一步详细说明'这将数据转移到子消息'的意思。 在对象层次结构中嵌套的接口是否存在问题(性能或其他)? – wal 2010-08-19 23:55:25

+0

@wal - 简单地说,你可能已经(为了清晰起见,没有使用特定的符号,并将'Field4'的标签改为5)'{1 = {len:5 = value}}'。我*认为*我们应该旨在支持(但不强制)序列化可以在*接口*上,所以我们有'{1 = {0},5 = value}',我们仍然拥有*具体子类型,但**除非它暴露了一些特定的附加数据,否则我们在接口级别序列化。 – 2010-08-20 05:16:18

+0

v2是否已经支持它? – mark 2011-05-24 19:59:47