Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
C# protobuf网中IEnumerable的序列化_C#_Grpc_Protobuf Net_Protobuf Net.grpc - Fatal编程技术网

C# protobuf网中IEnumerable的序列化

C# protobuf网中IEnumerable的序列化,c#,grpc,protobuf-net,protobuf-net.grpc,C#,Grpc,Protobuf Net,Protobuf Net.grpc,我有一个相当重的DTO库,目前正被一些WCF服务使用。我们正试图将它引入protobuf网络世界,尽可能少的修改。一组特殊的项在序列化中给我带来了麻烦。我将在这里简单介绍它们,因为它变得有点复杂,但问题的要点是: 公共类密钥 { 公共字符串Id{get;set;} } 公共类KeyCollection:IEnumerable { 私有只读列表; #可数区域 //等等。。。 #端区 } 公共类项目 { 公共长Id{get;set;} } 公共抽象类容器库 { } 公共抽象类ContainerBas

我有一个相当重的DTO库,目前正被一些WCF服务使用。我们正试图将它引入protobuf网络世界,尽可能少的修改。一组特殊的项在序列化中给我带来了麻烦。我将在这里简单介绍它们,因为它变得有点复杂,但问题的要点是:

公共类密钥
{
公共字符串Id{get;set;}
}
公共类KeyCollection:IEnumerable
{
私有只读列表;
#可数区域
//等等。。。
#端区
}
公共类项目
{
公共长Id{get;set;}
}
公共抽象类容器库
{ }
公共抽象类ContainerBase:ContainerBase
其中T:项目
{ }
公共抽象类ContainerType1Base:ContainerBase
{
公钥集合密钥{get;set;}
}
公共类ContainerType1:ContainerType1Base
{ }
我忽略了decorator,因为我不知道它们是问题所在,主要是因为如果我将
void add(Key item){}
添加到
KeyCollection
中,整个事情似乎都会起作用。否则,我在尝试序列化
ContainerType1
的实例时会遇到问题

实际上,更改
KeyCollection
的签名有点禁止,所以我尝试按照编程的方式来做。具体地说,在
ContainerType1
ContainerType1Base
ContainerBase
的“键”
ValueMember
上将
itemType
defaultType
设置为null。我还将
KeyCollection
上的
IgnoreListHandling
设置为
true
。。。这完全不起作用。我在客户端上得到了一个通用的“未能反序列化”异常,如果有帮助的话,我可以在这里发布。在服务器端,我使用
Serializer.serialize()
对其进行序列化,并吐出
Serializer.GetProto()
以及对象的JSON,它们似乎都可以正常工作


如何关闭列表处理?与此相关的是,是否有一种方法可以在序列化时打开额外的调试,以获取有关问题的更多信息?

基本上,显示的代码看起来不错。不幸的是,当前存在一个异常,这意味着当封送处理程序(序列化程序)由于某种原因失败时,它会丢弃原始异常,因此gRPC当前不会暴露实际问题。我已经为此提交了一个修复-它可能被接受,也可能不被接受

在此期间,我建议您只需从等式中删除gRPC,并仅模拟marshaller工作负载;为此,请在服务器上:生成要发送的数据,然后执行以下操作:

var ms=newmemoryStream();
Serializer.Serialize(ms,yourDataHere);
var payload=Convert.ToBase64String(ms.ToArray());
并获取
有效负载
(它只是一个
字符串
)的值。现在,在客户机上,反转此操作:

var ms=newmemoryStream(Convert.FromBase64String(thatStringValue));
序列化。反序列化(ms);
我的期望是,这将抛出一个异常,告诉您实际问题是什么


如果gRPC变更被合并,则故障应通过以下方式可用:

catch(RpcException故障)
{
var originalFault=fault.Status.DebugException;
// ^^^
}

IgnoreListHandling应该绝对有效。你是否有一个可运行的最小复制程序,在那里我可以看到与你看到的相同的东西?细节可能很重要。另外,您使用的库版本是什么?谢谢。我可以试着做一个小回购,我可以分享,这表明了这种行为。我正在使用protobuf-net.Grpc.Native,v1.0.123。我忘了提到(或者说它看起来不重要,但实际上可能很重要)这是在Grpc调用的上下文中完成的。因此,整个
容器类型1
是通过某种方法返回的。嗯,我编写了这两个库,所以。。。我应该能帮上忙:)重编真的会有帮助(顺便说一句,如果你用更新回复-尝试@me,即@foof-这会让我得到通知更可靠)@MarcGravel你说得对,我尝试用DTO库的一小部分复制我的问题,我能够1,复制它和2,
忽略列表处理
我的出路。原始DTO库仍在进行反序列化。。有没有办法打开更多调试信息?我得到的只是“未能反序列化”。