在发布此问题之前,我已经花了几个小时在论坛上搜索这个问题的答案,所以如果问题被提出,请原谅我。
我需要通过Jason RPC发送一个2字节的参数,但是我遇到了一些困难。
我正在使用VB.NET(VS 2013)作为我的开发平台。我创建了一个发送函数,这是我的问题的根源。这是一个片段:
**Public Function daliSend(url As String, universe_id As Integer, bytes As Byte(), expect_answer As Boolean, send_twice As Boolean) As Result
Dim rpcObject As New JObject() From { _
{"Id", generateRandomString()}, _
{"Jsonrpc", "2.0"}, _
{"method", "dali.send"}, _
{"params", New JObject() From { _
{"universe_id", universe_id}, _
{"bytes", bytes}, _
{"expect_answer", expect_answer}, _
{"send_twice", send_twice} _
}} _
}
Dim json As String = JsonConvert.SerializeObject(rpcObject ).ToLower()**
我正在为我的RPC请求发送“bytes”作为字节数组[187,0](即bytes(0)= 187,bytes(1)= 0)。但是,Jtoken立即通过base 64编码将字节数组转换为字符串。
使用TextVisualizer,我看到rpcObject =
{ “Id”:“penultes”, “Jsonrpc”:“2.0”, “方法”:“dali.send”, “params”:{ “universe_id”:4, “bytes”:“uwA =”, “expect_answer”:是的, “send_twice”:false } }
根据Json.Net序列化指南中的定义,Primitive Type Byte []转换为String(base 64编码)。实质上,以下.NET转换正在发生Convert.ToBase64String(bytes),它产生字符串“uwA =”。
我可以忍受。但是,这需要在序列化之前更改为字符串。关于如何在序列化之前修改上述对象(rpcObject)的任何想法?我需要做的是将字符串参数“bytes”值“uwA =”转换回“[187,0]”,可能使用Convert.FromBase64String(),因此数组是序列化的,而不是字符串。
在序列化之前,我还没有找到一种简单的方法来隔离该参数。
答案 0 :(得分:0)
Json.NET只会将字节数组序列化为Base64。其他非数组字节集合将被序列化为整数数组,例如Array.AsReadOnly<T>()
返回的集合:
bytes.ToList()
这里我使用JToken.FromObject()
将只读集合包装器序列化为所需的中间JArray
。您还可以序列化任何其他类似的等效字节集合,例如Array.AsReadOnly<T>()
。但是{{1}}返回一个只读集合 wrapper ,因此对于大型输入字节数组应该占用最少的内存。
示例fiddle。