我有一个相当重的DTO库,目前正在被一些WCF服务所使用。我们正试图把它带入原生态世界,尽量少做修改。一组特定的项目在序列化中给我带来麻烦。我将在这里简单地讨论它们,因为它变得有点复杂,但问题的要点是:
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,它们似乎都正常工作。
如何关闭列表处理?与此相关的是,是否有一种方法可以在序列化的同时启动额外的调试,以获取有关问题的更多信息?
发布于 2020-11-19 08:11:46
从根本上说,显示的代码看起来很好。不幸的是,当前有一个gRPC中的“特性”,这意味着当封送处理程序(序列化程序)由于某种原因而失败时,它会丢弃原始异常,因此gRPC目前并不公开实际的问题。我已经为此提交了一个解决方案--它可能被接受,也可能不被接受。
在此期间,我建议您将gRPC从等式中移除,并仅模拟封送器工作负载;要做到这一点,在服务器上:生成要发送的数据,然后执行以下操作:
var ms = new MemoryStream();
Serializer.Serialize(ms, yourDataHere);
var payload = Convert.ToBase64String(ms.ToArray());并获得payload的值(它只是一个string)。现在,在客户端,反转这个:
var ms = new MemoryStream(Convert.FromBase64String(thatStringValue));
Serialize.Deserialize<YourTypeHere>(ms);我在这里的期望是,这将抛出一个异常,它将告诉您实际问题是什么。
如果gRPC更改被合并,那么错误应该可以通过以下方式获得:
catch (RpcException fault)
{
var originalFault = fault.Status.DebugException;
// ^^^
}https://stackoverflow.com/questions/64868856
复制相似问题