【问题标题】:Sending Protocol Buffered object in .Net ApiController to protobuf.js将 .Net ApiController 中的协议缓冲对象发送到 protobuf.js
【发布时间】:2015-08-26 16:26:39
【问题描述】:

我正在尝试在 .net 中使用 Proto-buf c# 库。我正在使用 ApiController 和 System.Net.WebSockets 命名空间。它有一种获取传入消息的方法。

ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);

我需要一个流来使用 protobuf。我不确定如何使用此命名空间,因为它使用的是 ArraySegment。
我能够将 proto-buf 对象发送到 decode/protobuf.js,但现在已经在 js 客户端上构建了一个对象并正在发送到服务器。

示例 cust = Serializer.DeserializeWithLengthPrefix(result, PrefixStyle.Base128);

【问题讨论】:

  • 不清楚问题是发送回客户(根据您的标题)还是接收来自客户(根据正文)。请澄清。

标签: .net protobuf-net


【解决方案1】:

如果你只需要一个 Stream 来反序列化,你可以使用:

var stream = new MemoryStream(buffer.Array, buffer.Offset, result.Count);

ArraySegment&lt;byte&gt; 已经包装了 byte[],因此您只需创建一个 MemoryStream 包装相同的字节数组,并具有正确的偏移量和长度。

【讨论】:

  • 如何知道 ArraySegment ArraySegment buffer = new ArraySegment(new byte[1024]);我用我的示例创建了一个全新的项目,现在我得到“源数据中的无效字段:0”
  • @magister:这对我来说听起来像是一个不同的问题——而且我们真的没有足够的信息让你知道。 (而且我对 Web 套接字的了解还不够,不知道它们是否需要被视为流,或者它们是否已经是面向消息的。)
  • 是的,我恢复到 protobuf-net 2.0.0.480,因为我的新项目具有 nuget protobuf-net 2.0.0.668 的最新版本(最新稳定版)。并且该对象不会反序列化。我认为这与缓冲区大小有关。
  • @magister:听起来你应该做一些工作来诊断它——看看 Javascript 中的序列化大小,看看 result.Count 在 .NET 中是什么,等等。我不能确实有助于诊断像“我认为它与缓冲区大小或其他东西有关”这样模糊的诊断
  • 好吧,我将不得不尝试获取更多信息。我没有过多地使用缓冲区和流,我只是在监视列表中看到一个字节数组,所以我真的不知道里面有什么。我还认为 System.Net.WebSockets.WebSocket.ReceiveAsync 可能过于抽象,应该使用 TcpClient.GetStream() 特别是如果我的协议对象变大
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多