关于在 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;}
}