Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
协议缓冲区.NET继承_.net_Protocol Buffers_Protobuf Net - Fatal编程技术网

协议缓冲区.NET继承

协议缓冲区.NET继承,.net,protocol-buffers,protobuf-net,.net,Protocol Buffers,Protobuf Net,我有协议缓冲区格式的数据,可以描述如下 消息部分{ 重复截面=1; } 消息部分{ 所需uint32类型=1; 所需字节有效载荷=2; } 消息节类型1{ 必需的int32 fieldType1=1; // ... } 消息节类型2{ 必需的int32 fieldType2=1; // ... } 信息部分类型3{ 必需的int32字段类型3=1; // ... } 我正在使用protobuf网络库(+protogen+预编译)。 如何将此类数据反序列化为DTO,类似于 公共类部分 { 公共列

我有协议缓冲区格式的数据,可以描述如下

消息部分{
重复截面=1;
}
消息部分{
所需uint32类型=1;
所需字节有效载荷=2;
}
消息节类型1{
必需的int32 fieldType1=1;
// ...
}
消息节类型2{
必需的int32 fieldType2=1;
// ...
}
信息部分类型3{
必需的int32字段类型3=1;
// ...
}
我正在使用protobuf网络库(+protogen+预编译)。 如何将此类数据反序列化为DTO,类似于

公共类部分
{
公共列表节{get;}
}
公共抽象类组
{
}
公共类章节类型1:章节
{
public int FieldType1{get;}
}
公共类章节类型2:章节
{
public int FieldType2{get;}
}
公共类章节类型3:章节
{
public int FieldType3{get;}
}

有没有可能从.NET处理此类数据(因为我使用的是轻型框架,所以使用预编译)?

要做到这一点,您必须手动操作,即

[ProtoContract]
public abstract class Section
{
    [ProtoMember(1)] public int Type {get;set;}
    [ProtoMember(2)] public byte[] Payload {get;set;}
}
然后手动处理剩下的。protobuf网络继承映射位于以下.proto架构的顶部:

message Section {
    optional SectionType1 Type1 = 1;
    optional SectionType2 Type2 = 2;
    optional SectionType3 Type3 = 3;
}
如果我们有,就说:

[ProtoInclude(1, typeof(SectionType1)]
[ProtoInclude(2, typeof(SectionType2)]
[ProtoInclude(3, typeof(SectionType3)]
public abstract class Section
{
}

为了添加我的发现,我创建了.proto文件,它有一个基类和20个派生类。 我通过protobuf net r668\ProtoGen生成了代码。 我按照上面列出的步骤进行操作,但仍然出现错误,未找到子类型

通过点击和试用,我看到生成的代码具有global::ProtoBuf.IExtensible针对所有生成的类,我从所有生成的类中删除了这个加上下面3行的代码 私有全局::ProtoBuf.IExtension扩展对象; 全局::ProtoBuf.IExtension全局::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing) {return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject,createIfMissing);}


在此之后,错误没有出现。我不知道它为什么有用,但它起了作用。

协议缓冲区用于序列化信息——以一种平缓和顺序的方式。你应该把你在这种东西中使用的任何类型看作是“形状”,它只包含数据,没有继承或行为。请参见数据传输对象。