Protocol buffers 用于多重继承的原型文件

Protocol buffers 用于多重继承的原型文件,protocol-buffers,protobuf-net,Protocol Buffers,Protobuf Net,这就是我的类建模的方式。对不起,太长了: [Serializable] [DataContract] public class RequestSection { [DataMember(Order = 1)] public List<BaseA> Allrequests; public RequestSection() { Allrequests = new List<BaseA>(); } } [Serializ

这就是我的类建模的方式。对不起,太长了:

[Serializable]
[DataContract]
public class RequestSection
{
    [DataMember(Order = 1)]
    public List<BaseA> Allrequests;

    public RequestSection()
    {
        Allrequests = new List<BaseA>();
    }
}
[Serializable]
[DataContract]
[ProtoInclude(2, typeof(BaseA<derResponse1>))]
[ProtoInclude(3, typeof(BaseA<derResponse2>))]
public abstract class BaseA
{
    [DataMember(Order = 1)]
    public int baseA = 10;
}

[Serializable]
[DataContract]
[ProtoInclude(2, typeof(der1))]
[ProtoInclude(3, typeof(der2))]
public abstract class BaseA<T> : BaseA where T : ResponseBaseA, new()
{
    T _Response;
    /// <summary>
    /// 
    /// </summary>
    [System.Runtime.Serialization.DataMember(Order = 1)]
    public new T Response
    {
        get { return _Response; }
        set { _Response = value; }
    }
}

[Serializable]
[DataContract]
public class der1 : BaseA<derResponse1>
{
    [DataMember(Order = 1)]
    public int derive1 = 20;
}
[Serializable]
[DataContract]
public class der2 : BaseA<derResponse2>
{
    [DataMember(Order = 1)]
    public int derive2 = 30;
}

[Serializable]
[DataContract]
[ProtoInclude(2, typeof(derResponse1))]
[ProtoInclude(3, typeof(derResponse2))]
public abstract class ResponseBaseA
{
    [DataMember(Order = 1)]
    public int responseBaseA = 100;
}
[Serializable]
[DataContract]
public class derResponse1 : ResponseBaseA
{
    [DataMember(Order = 1)]
    public int derResp1 = 200;
}
[Serializable]
[DataContract]
public class derResponse2 : ResponseBaseA
{
    [DataMember(Order = 1)]
    public int derResp2 = 300;
}
我无法使用protobuf net(v1和v2都是未知的子类型)序列化部分,所以我尝试运行时模型

这是iam使用的原始文件

message RequestSection{
    repeated BaseA requests=1;
}
message BaseA{
    optional int32 baseA=1;
    optional BaseA1Generic BaseA1Generic =2;
    optional BaseA2Generic BaseA2Generic =3;
}
message BaseA1Generic{
    optional ResponseBaseA baseResponse =1; 
    optional Der1 requestDer1 = 2;
}
message BaseA2Generic{
    optional ResponseBaseA baseResponse =1; 
    optional Der2 requestDer2 = 3;
}
message ResponseBaseA{
    optional int32 responseBaseA = 1;
    optional derResponse1 derivedResponse1 =2;   
    optional derResponse2 derivedResponse2 =3;   
}
message derResponse1{
    optional int32 derResponse1 = 1;
}
message derResponse2{
    optional int32 derResponse2 = 1;
}
message Der1{
    optional int32 d1=1;
}
message Der2{
    optional int32 d2=1;
} 
它不是在Java端进行反序列化,只得到这个

requests {
  baseA: 10
  1000: "\302>\002\b\024"
}
requests {
  baseA: 10
  1001: "\302>\002\b\036"
}

我正试图使我的原型文件通用,因为我可能在节请求下有任何类(将来有der1/der2/或更多)。目前的问题是,您的模型为
BaseA
BaseA
都指定了
der1
der2
,这意味着有两条通往
der1
/
der2
的路线。在v2中,我们可以通过为每个封闭泛型类型显式指定继承来避免这种情况;因此:从
BaseA
中删除两个
[ProtoInclude(…)]
,而是使用:

RuntimeTypeModel.Default[typeof(BaseA<derResponse1>)].AddSubType(2,typeof(der1));
RuntimeTypeModel.Default[typeof(BaseA<derResponse2>)].AddSubType(3,typeof(der2));
RuntimeTypeModel.Default[typeof(BaseA)].AddSubType(2,typeof(der1));
RuntimeTypeModel.Default[typeof(BaseA)].AddSubType(3,typeof(der2));
作为旁注;这里不要求它们使用不同的数字,因为它们是独立的。他们都可以使用字段
2
is your like;但使用不同的字段号也可以

RuntimeTypeModel.Default[typeof(BaseA<derResponse1>)].AddSubType(2,typeof(der1));
RuntimeTypeModel.Default[typeof(BaseA<derResponse2>)].AddSubType(3,typeof(der2));