0

这与另一个问题直接相关。在将对象传入和传出使用 s 的 .NET Framework 客户端时BrokeredMessage,这些BrokeredMessages 不只是使用简单的 JSON 或 XML 来序列化这些对象。它似乎是一种更专有的格式。因此,例如,只传递简单的字符串值"test123",而不是这样:

"   t   e   s   t   1   2   3   "
34  116 101 115 116 49  50  51  34

你会得到更像这样的东西:

@   [ACKNOWLEDGE]   s   t   r   i   n   g   [BACKSPACE]   3
64  6               115 116 114 105 110 103 8             51

h   t   t   p   :   /   /   s   c   h   e   m   a   s   .   m   ...
104 116 116 112 58  47  47  115 99  104 101 109 97  115 46  109 ...

Ö   [BELL]   t   e   s   t   1   2   3
153 7        116 101 115 116 49  50  51

我环顾四周,包括 for 和在http://schemas...序列化示例中指定的 URL,但没有找到关于如何序列化BrokeredMessage. 在某种程度上,我已经能够对一种方法进行逆向工程,以Message在 .NET Standard/CoreBrokeredMessage中的 s 和 .NET Framework 中的 s 之间发送至少更小的字符串,但这是启发式的,等等。

是否有规范明确说明BrokeredMessages 使用的序列化模式是什么?

4

1 回答 1

2

如果意图是只获取消息正文而不考虑内容,则可以将其作为流获取。

Stream stream = message.GetBody<Stream>();
StreamReader reader = new StreamReader(stream);
string s = reader.ReadToEnd();

正如 ckross01在这里回答的那样。

要将完整的 BrokeredMessage 序列化为对象,下面是代码 -

public T GetBody<T>(BrokeredMessage brokeredMessage)
{
  var ct = brokeredMessage.ContentType;
  Type bodyType = Type.GetType(ct, true);

  var stream = brokeredMessage.GetBody<Stream>();
  DataContractSerializer serializer = new DataContractSerializer(bodyType);
  XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max);
  object deserializedBody = serializer.ReadObject(reader);
  T msgBase = (T)deserializedBody;
  return msgBase;
}

正如 yamspog在这里回答的那样。

于 2020-07-23T11:18:22.250 回答