关于如何宣布[ProtoContract]
的ID的方式/位置我有几个问题。
想象一下以下代码:
[ProtoContract]
[ProtoInclude(100, typeof(SomeClassA))]//1) CAN I USE 1 here?
public abstract class RootClass{
[ProtoMember(1)]
public int NodeId {get;set;}
}
[ProtoContract]
[ProtoInclude(200, typeof(SomeClassC)]//2) Should I declare this here or directly on the RootClass?
//3) Can I use the id 100 here?
//4) Can I use the id 1 here? or member + include share the id?
public class SomeClassA : RootClass{
[ProtoMember(1)]//5) CAN I USE 1 here? Since the parent already use it but it's a different class
public String Name{get;set;}
}
[ProtoContract]
public class SomeClassC : SomeClassA {
[ProtoMember(2)]
public int Count{get;set;}
}
[ProtoContract]
public class SomeClassD : SomeClassA {
[ProtoMember(2)] //6) Can I use 2 here? Since SomeClassC already use it and is a sibling?
public int Count{get;set;}
}
我已经提出了几个问题:
问题是我们有一个包含很多类的庞大模型,所有类都来自同一个对象,因此我想知道应该注意哪个ID。
答案 0 :(得分:4)
简短版本:
更长的版本:
原因是子类型基本上映射为可选字段:
[ProtoContract]
[ProtoInclude(100, typeof(SomeClassA))]
public abstract class RootClass{
[ProtoMember(1)]
public int NodeId {get;set;}
}
[ProtoContract]
[ProtoInclude(200, typeof(SomeClassC)]
public class SomeClassA : RootClass{
[ProtoMember(1)]
public String Name{get;set;}
}
[ProtoContract]
public class SomeClassC : SomeClassA {
[ProtoMember(2)]
public int Count{get;set;}
}
是proto2
语法:
message RootClass {
optional int32 NodeId = 1;
optional SomeClassA _notNamed = 100;
}
message SomeClassA {
optional string Name = 1;
optional SomeClassC _notNamed = 200;
}
message SomeClassC {
optional int32 Count = 2;
}
请注意,最多使用1个子类型字段,因此oneof
可以将其视为.proto
。与子类型相关的任何字段都将包含在message SomeClassA
中,因此与RootClass
不存在冲突,并且它们不需要是唯一的。 message
意义上的每.proto
个数字只需要是唯一的。
采取具体问题,然后:
NodeId
SomeClassA
上宣布; protobuf-net只期待直接后代,并且它使编号保持一致且方便可读,因为字段编号只需要与SomeClassA
的成员不冲突Name
是的,你可以;没有冲突 - 虽然实际上protobuf-net甚至不会将SomeClassD
视为兄弟 (它不会作为包含在任何地方做广告) - 但是如果有{在[ProtoInclude(201, typeof(SomeClassD))]
上{1}},那就没关系了。这会将我们的SomeClassA
更改为添加:
.proto
到optional SomeClassD _alsoNotNamed = 201;
,然后添加:
message SomeClassA
请注意,protobuf-net不会实际生成message SomeClassD {
optional int32 Count = 2;
}
语法,除非您明确要求(通过.proto
等) - 我将其纯粹包括在内在潜在的protobuf概念方面的说明性目的。