关于在 Protobuf-net 中实现 VARIANT
About implement VARIANT in Protobuf-net
我有一些 protobuf 解码器字符串,我从 https://protogen.marcgravell.com/decode 像这样解码:
Field #1: 08 Varint Value = 0, Hex = 00
Field #2: 12 String Length = 0, Hex = 00, UTF8 = ""
Field #3: 1A String Length = 51, Hex = 33, UTF8 = "..................." (total 46 chars)
As sub-object :
Field #1: 08 Varint Value = 1610099957
Field #4: 20 Varint Value = 2, Hex = 02
Field #5: 2A String Length = 166, Hex = A6-01, UTF8 = "..........................." (total 156 chars)
As sub-object :
Field #1: 08 Varint Value = 1610070445
Field #2: F5 String Length = 148, Hex = D9-E0, UTF8 = "........................." (total 138 chars)
As sub-object :
Field #1: 08 String Length = 39, Hex = 00, UTF8 = "......" (total 37 chars)
As sub-object :
Field #1: 08 Varint Value = 12345678
Field #2: 33 Varint Value = 3333333333, Hex = 08-F5-D9-E0-FF
Field #6: F5 Varint Value = 1, Hex = D9
Field #7: 42 String Length = 0, Hex = 00, UTF8 = ""
如何在 c# 中定义原型 class 和 varint 大小,如下所示:
[ProtoContract]
public class AllFields
{
[ProtoMember(1)]
public int Field1 { get; set; }
[ProtoMember(2)]
public string Field2 { get; set; }
[ProtoMember(3)]
public string Field3 { get; set; }
public abstract class subField3
{
[ProtoMember(1)]
public long subField3_1 { get; set; }
}
[ProtoMember(4)]
public int Field4 { get; set; }
[ProtoMember(5)]
public string Field5 { get; set; }
public abstract class subField5
{
}
....
}
以及如何继承子对象
varint 的大小由值决定:无需配置或确定。
至于子对象:不要使用 string
,而是使用具体的(非抽象的)class,你应该没问题 - 只需使用那种类型而不是 [=11] =].该库显示了这两种可能性,因为没有模式,它不能确定它是哪一种,因为字符串和子对象使用相同的协议布局。但字段 5 可能是:
[Proto member(5)]
public Whatever SomeName { get; set;}
...
[ProtoContract]
public class Whatever {
[ProtoMember(1)]
public int Id {get; set;}
[ProtoMember(2)]
public AnotherType AnotherThing {get; set;}
}
这是解码字符串:
字段2有多个
终于明白了:
[ProtoContract]
public class MessageStructs
{
[ProtoMember(1)]
public FontsInfo fontInfo;
[ProtoMember(2)]
public Structs MsgContent;
}
[ProtoContract]
[ProtoInclude(21, typeof(Structs))]
public interface IInterface
{
MainContent MessageContent {get;}
MsgType MessageType {get;}
Informations MessageOther {get;}
}
[ProtoContract]
public class Structs : IInterface
{
[ProtoMember(1)]
public MainContent Message_Content {get; set;}
[ProtoMember(9)]
public MsgType Message_Type {get; set;}
[ProtoMember(37)]
public Informations Message_Other {get; set;}
}
我有一些 protobuf 解码器字符串,我从 https://protogen.marcgravell.com/decode 像这样解码:
Field #1: 08 Varint Value = 0, Hex = 00
Field #2: 12 String Length = 0, Hex = 00, UTF8 = ""
Field #3: 1A String Length = 51, Hex = 33, UTF8 = "..................." (total 46 chars)
As sub-object :
Field #1: 08 Varint Value = 1610099957
Field #4: 20 Varint Value = 2, Hex = 02
Field #5: 2A String Length = 166, Hex = A6-01, UTF8 = "..........................." (total 156 chars)
As sub-object :
Field #1: 08 Varint Value = 1610070445
Field #2: F5 String Length = 148, Hex = D9-E0, UTF8 = "........................." (total 138 chars)
As sub-object :
Field #1: 08 String Length = 39, Hex = 00, UTF8 = "......" (total 37 chars)
As sub-object :
Field #1: 08 Varint Value = 12345678
Field #2: 33 Varint Value = 3333333333, Hex = 08-F5-D9-E0-FF
Field #6: F5 Varint Value = 1, Hex = D9
Field #7: 42 String Length = 0, Hex = 00, UTF8 = ""
如何在 c# 中定义原型 class 和 varint 大小,如下所示:
[ProtoContract]
public class AllFields
{
[ProtoMember(1)]
public int Field1 { get; set; }
[ProtoMember(2)]
public string Field2 { get; set; }
[ProtoMember(3)]
public string Field3 { get; set; }
public abstract class subField3
{
[ProtoMember(1)]
public long subField3_1 { get; set; }
}
[ProtoMember(4)]
public int Field4 { get; set; }
[ProtoMember(5)]
public string Field5 { get; set; }
public abstract class subField5
{
}
....
}
以及如何继承子对象
varint 的大小由值决定:无需配置或确定。
至于子对象:不要使用 string
,而是使用具体的(非抽象的)class,你应该没问题 - 只需使用那种类型而不是 [=11] =].该库显示了这两种可能性,因为没有模式,它不能确定它是哪一种,因为字符串和子对象使用相同的协议布局。但字段 5 可能是:
[Proto member(5)]
public Whatever SomeName { get; set;}
...
[ProtoContract]
public class Whatever {
[ProtoMember(1)]
public int Id {get; set;}
[ProtoMember(2)]
public AnotherType AnotherThing {get; set;}
}
这是解码字符串:
字段2有多个
终于明白了:
[ProtoContract]
public class MessageStructs
{
[ProtoMember(1)]
public FontsInfo fontInfo;
[ProtoMember(2)]
public Structs MsgContent;
}
[ProtoContract]
[ProtoInclude(21, typeof(Structs))]
public interface IInterface
{
MainContent MessageContent {get;}
MsgType MessageType {get;}
Informations MessageOther {get;}
}
[ProtoContract]
public class Structs : IInterface
{
[ProtoMember(1)]
public MainContent Message_Content {get; set;}
[ProtoMember(9)]
public MsgType Message_Type {get; set;}
[ProtoMember(37)]
public Informations Message_Other {get; set;}
}