代码之家  ›  专栏  ›  技术社区  ›  wal

协议网络和接口支持

  •  1
  • wal  · 技术社区  · 14 年前

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

    [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; }
    }
    

    我已经设法通过改变protobufnet的v1源代码来实现这一点。 只要为接口定义了ProtoInclude,我就看不出这种方法有任何问题。

    很明显,为了编译这个,我必须允许ProtoContract和ProtoInclude在接口上进行修饰,并在这里和那里进行一些其他更改。(注意,我会使用DataContract/KnownType,但是这些属性也不能在接口上修饰)

    你能谈谈可能的缺点吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Marc Gravell    13 年前

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

    但是,应该可以支持这两种使用模式。如果您想将其作为v1的补丁发送(使用相同的许可证等),我很乐意看一看:)


    这是v2的标准功能