首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在protobuf-net中序列化IEnumerable

问在protobuf-net中序列化IEnumerable
EN

Stack Overflow用户
提问于 2020-11-17 03:20:28
回答 1查看 514关注 0票数 1

我有一个相当重的DTO库,目前正在被一些WCF服务所使用。我们正试图把它带入原生态世界,尽量少做修改。一组特定的项目在序列化中给我带来麻烦。我将在这里简单地讨论它们,因为它变得有点复杂,但问题的要点是:

代码语言:javascript
复制
public class Key
{
   public string Id {get; set;}
}

public class KeyCollection : IEnumerable<Key>
{
   private readonly List<Key> list;

#region IEnumerable
   // etc...
#endregion
}

public class Item
{
   public long Id { get; set; }
}

public abstract class ContainerBase
{ }

public abstract class ContainerBase<T> : ContainerBase
   where T : Item
{ }

public abstract class ContainerType1Base : ContainerBase<Item>
{
   public KeyCollection Keys { get; set; }
}

public class ContainerType1 : ContainerType1Base
{ }

我忽略了装饰师,因为他们不是问题所在,主要是因为如果我将void Add(Key item) { }添加到KeyCollection中,那么整个事情似乎都是可行的。否则,我在序列化ContainerType1实例时遇到问题。

实际上,更改KeyCollection的签名有点让人望而却步,所以我试图跟随这个答案来尝试编程实现它。具体来说,将itemType和defaultType设置为空在ContainerType1、ContainerType1Base和ContainerBase<Item>的"Keys“ValueMember上。我还把IgnoreListHandling设置为true on KeyCollection..。完全不起作用。我在客户机上得到一个通用的“反序列化”异常,如果它有帮助的话,我可以在这里发布。在服务器端,我使用Serializer.Serialize()将其序列化,并输出对象的Serializer.GetProto<>()和JSON,它们似乎都正常工作。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-19 08:11:46

从根本上说,显示的代码看起来很好。不幸的是,当前有一个gRPC中的“特性”,这意味着当封送处理程序(序列化程序)由于某种原因而失败时,它会丢弃原始异常,因此gRPC目前并不公开实际的问题。我已经为此提交了一个解决方案--它可能被接受,也可能不被接受。

在此期间,我建议您将gRPC从等式中移除,并仅模拟封送器工作负载;要做到这一点,在服务器上:生成要发送的数据,然后执行以下操作:

代码语言:javascript
复制
var ms = new MemoryStream();
Serializer.Serialize(ms, yourDataHere);
var payload = Convert.ToBase64String(ms.ToArray());

并获得payload的值(它只是一个string)。现在,在客户端,反转这个:

代码语言:javascript
复制
var ms = new MemoryStream(Convert.FromBase64String(thatStringValue));
Serialize.Deserialize<YourTypeHere>(ms);

我在这里的期望是,这将抛出一个异常,它将告诉您实际问题是什么。

如果gRPC更改被合并,那么错误应该可以通过以下方式获得:

代码语言:javascript
复制
catch (RpcException fault)
{
    var originalFault = fault.Status.DebugException;
    // ^^^
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64868856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档