这是我的课程建模方式。对不起,很久了:
[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;
}
}
我们创建它们的方式就在这里
RequestSection section = new RequestSection();
der1 der1 = new der1();
der2 der2 = new der2();
section.Allrequests.Add(der1);
section.Allrequests.Add(der2);
我无法使用protobuf-net(v1和v2 - 他们说未知的子类型)序列化部分,所以我尝试运行时模型。
这是我使用的原型文件。
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"
}
我正在尝试将我的proto文件设为通用文件,因为我可能在部分请求下有任何类(der1 / der2 /或更多)。
答案 0 :(得分:2)
目前的问题是,您的模型为 der1
和der2
都指定了BaseA<derResponse1>
和BaseA<derResponse2>
,这意味着是der1
/ der2
的两条路线。在v2中,我们可以通过为每个封闭的泛型类型显式指定继承来避免这种情况;所以:从[ProtoInclude(...)]
中删除两个BaseA<T>
,然后使用:
RuntimeTypeModel.Default[typeof(BaseA<derResponse1>)].AddSubType(2,typeof(der1));
RuntimeTypeModel.Default[typeof(BaseA<derResponse2>)].AddSubType(3,typeof(der2));
作为旁注;它们不需要在这里使用不同的数字,因为它们是独立的。他们都可以使用字段2
是你喜欢的;但是使用不同的字段数也很好。