protobuf-net和接口支持

时间:2010-08-19 15:11:56

标签: c# serialization 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-net的v1源来实现这一点。 只要为接口定义了ProtoInclude,我就没有看到这种方法有任何问题。

显然,为了让它能够进行编译,我必须允许ProtoContract和ProtoInclude在接口上进行修饰,以及其他一些变化。 (注意,我会使用DataContract / KnownType,但这些属性也无法在接口上进行修饰)

请您评论一下可能存在的缺点吗?

1 个答案:

答案 0 :(得分:2)

我可以看到的主要问题是,就有效载荷而言,这会将数据移动到子消息中。我有一些关于v2的类似设计,希望绕过这个,保留主要消息中的大多数值。出于理智的原因,我主要考虑到这个变化只是v2(因为这两个实现是分开的,而v2有一个更好的类型模型)。

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


这是v2的标准功能