2017-05-18 3 views
2

포럼을 검색하기 전에이 질문에 대한 답변을 찾기 위해 몇 시간을 보냈습니다. 질문이있는 경우 실례합니다.JSON RPC 응용 프로그램 : JToken에 바이트 배열 추가

제이슨 RPC를 통해 2 바이트 매개 변수를 보내야하지만 약간의 어려움이 있습니다.

저는 개발 플랫폼으로 VB.NET (VS 2013)을 사용하고 있습니다. 내 문제의 근원 인 send 함수를 만들었습니다. 여기 단편이다

**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()** 

I 바이트 배열 [187,0]로 "바이트"를 보낸다 (즉 바이트 (0) = 187 (바이트) (1) = 0) 내 RPC 요청. 그러나 Jtoken은 바이트 배열을 기본 64 인코딩을 통해 즉시 문자열로 변환합니다. TextVisualizer를 사용

, 내가 볼 rpcObject =

{ "ID"그 "penultes" "JSONRPC": "2.0", "방법": "dali.send" "의 PARAMS "{ "universe_id "4 "바이트 ""우와 = " "expect_answer "참 "send_twice "거짓 }는 Json.Net 직렬화에 의해 정의 }

안내서, Primitive Type Byte []는 String으로 변환됩니다 (Base 64로 인코딩 됨). 본질적으로 다음 .NET 변환은 "uwA ="문자열을 생성하는 Convert.ToBase64String (bytes)을 발생시킵니다.

나는 그걸로 살 수 있습니다. 그러나 직렬화를 문자열로 변경하기 전에이를 변경해야합니다. 직렬화 이전에 위의 객체 (rpcObject)를 어떻게 수정할 수 있습니까? 문자열 매개 변수 "바이트"값을 "uwA ="로 변환하고 Convert.FromBase64String()을 사용하여 "[187,0]"으로 변환하여 배열을 문자열과 직렬화합니다.

직렬화 전에 매개 변수를 쉽게 분리 할 수있는 쉬운 방법을 찾지 못했습니다.

답변

0

Json.NET은 바이트 만을 Base64로 직렬화합니다. 다른 비 배열 바이트 컬렉션은 정수 배열로 serialize됩니다 (예 : Array.AsReadOnly<T>()에 의해 반환 된 컬렉션 : 여기

Dim rpcObject As New JObject() From { _ 
    {"Id", generateRandomString()}, _ 
    {"Jsonrpc", "2.0"}, _ 
    {"method", "dali.send"}, _ 
    {"params", New JObject() From { _ 
     {"universe_id", universe_id}, _ 
      {"bytes", JToken.FromObject(Array.AsReadOnly(bytes))}, _ 
     {"expect_answer", expect_answer}, _ 
     {"send_twice", send_twice} _ 
    }} _ 
} 

내가 JToken.FromObject()을 사용하고 필요한 중간 JArray에 읽기 전용 수집 래퍼를 직렬화합니다. 비슷한 다른 바이트 컬렉션을 직렬화 할 수도 있습니다 (예 : bytes.ToList(). 그러나 Array.AsReadOnly<T>()은 읽기 전용 모음 래퍼을 반환하므로 큰 입력 바이트 배열에 대해 최소한의 메모리를 사용해야합니다.

샘플 fiddle.

+0

좋아요! 나는 그것을 시도 할 것이다. –

+0

@MichaelFreeman - 작동 했습니까? – dbc

+0

바이트 배열을 목록 (즉, List (Of [Byte])의 바이트로 변경) –