2014-11-14 3 views
1

데이터가 네트워크를 통과 할 때 직렬화 될 수있는 클래스 메시지가 있습니다. 현재 JSON을 사용하고 있습니다. 주로 모든 것을 JSON으로 사용하기 때문입니다. (웹 서비스, 소켓).Javascript를 사용하여 네트워크를 통해 객체를 직렬화하려면 어떻게해야합니까?

가능한 한 선명하게하기 위해 직렬화를 개선하고 싶습니다. 여기서 재현이 가능하다고 생각합니다.

모든 것, 모든 응답 클라이언트/서버 또는 서버/클라이언트 그리고 심지어 서버 또는 클라이언트 내부에서 사용되기 때문에 특히 소켓 (비디오 게임)에서 사용할 때 전송 문자열을 더 가볍게 만드는 것이 목표입니다. 데이터를 제공하는 일반적인 방법입니다.

메시지는 MessageLang과 같은 다른 개체 인스턴스를 포함 할 수도있는 복잡한 개체로, 코드를 기반으로 클라이언트에서 문장을 번역 할 수 있습니다.

는 지금까지, 여기에 좋은 결과입니다 작품 :

verbose: websocket writing 5:::{"name":"user.newAuthenticated","args":["{\"m\":\"Respond to all clients\",\"d\":{},\"s\":1,\"t\":\"m\"}"]} 
:

verbose: websocket writing 5:::{"name":"user.newAuthenticated","args":["Respond to emitter"]} 

소켓 서버가 간단한 메시지 인스턴스로 방출 :

소켓 서버 간단한 문자열와 방출

복잡한 메시지 인스턴스가있는 소켓 서버 방출 :

verbose: websocket writing 5:::{"name":"user.newAuthenticated","args":["{\"m\":{\"m\":\"__12\",\"a\":{\"field\":\"name\",\"min\":3,\"max\":20}},\"d\":{\"key\":\"fakeKey\"},\"s\":1,\"t\":\"m\"}"]} 

complexe 메시지가 다음 문장으로 렌더링 :

이름의 최소 길이 3. 최대 길이가 20하고 data에서 key: "fakeKey"를 포함하는 것입니다. 어떻게 작동하는지 설명하기 만하면됩니다. 보시다시피

메시지가 커지고을 얻을 정상입니다,하지만 난 여기에 더 나은 직렬화하기 위해 무엇을 할 수 있는지 알고 싶습니다 :이 '그런가하면

  • 는 메시지 자체를 삭제를 이뿐만 아니라 빈 때
  • 데이터를 삭제 (비어 있음) t
  • 는 J이기 때문에 소켓 로그에 \많은를 참조
  • (이 디폴트 값이기 때문에)는 false 때의 상태를 삭제 아들, 그게 문제라고 생각합니다. 내가 뭔가를 추가 할 때마다 내가 원하지 않는 여분의 캐릭터를 얻게 될 것이기 때문입니다. 어쩌면 JSON은 좋은 선택이 아니며 우선 JSON에서 먼저 예제와 같이 다르게 serialize해야합니다. 그러나 다른 방식으로는 이진 형식을 사용해야합니다.

어떻게 생각하십니까?

그리고 을 다른 형식의 메시지 인으로 암호화하는 것이 좋습니다. 암호화 비용은 그만한 가치가 있습니까?암호화하기 때문에 약간의 시간이 걸릴 것이므로 소켓을 통해 메시지를 보내는 데 걸리는 시간이 짧아지기 때문에 문제가 옮겨지지 않을지 궁금 할뿐입니다. 더 많은 시간을 암호화 할 수 있습니다. 그냥 궁금해.

+0

예에서 '데이터'또는 '상태'가 표시되지 않습니다. –

+0

각각'd'와's'에 일련 번호가 있습니다. 'm'은'message'를 의미합니다. – Vadorequest

답변

2

내 생각에 메시지 개체에는 두 개의 필드 (nameargs)가 있습니다.

메시지의 길이를 줄이려면 (꽤 쓸모없는) 바깥 쪽 개체를 제거하고 배열로 바꾸는 것이 가장 좋습니다. 그래서 빈 메시지

{"name":"empty","args":[]} 

["empty",[]] 

또는

["empty"] 

다음 일은 당신이 인수의 직렬화의 버그를 가지고있다 될 것입니다. JSON을 보내는 대신 JSON 데이터를 문자열로 묶습니다. 예 : 인증 된 경우에, 당신은

{"name":"user.newAuthenticated","args":["{\"m\":\"Respond to all clients\",\"d\":{},\"s\":1,\"t\":\"m\"}"]} 

를 보낼 수 있지만 대신

{"name":"user.newAuthenticated","args":[{"m":"Respond to all clients","d":{},"s":1,"t":"m"}]} 

를 보내야합니다. 이제 질문은 args가 단일 객체의 목록인지 여부입니다. 항상 단일 객체라면 []도 제거 할 수 있습니다. 위에서 제안한 변경 사항을 통해 다음과 같이 표시됩니다.

["user.newAuthenticated",{"m":"Respond to all clients","d":{},"s":1,"t":"m"}] 

꽤 좋은 IMO입니다.

["user.newAuthenticated",{"m":"Respond to all clients","s":1,"t":"m"}] 

(즉, 우리가 빈 d 속성을 생략 할 수 있습니다) : 당신이 제대로 (디) 직렬 핸들 기본값을 만들 수 있다면, 당신은이를 줄일 수 있습니다.

+0

사실, 메시지 자체는'message','data','status' 및'typeMessage'에 대한 네 개의 필드 :'m','d','s' 및't'입니다. 여러분이 보았던 'name'은 소켓에 의해 생성 된 것이었고'args'는 실제로 메시지 자체를 포함하고 있습니다. – Vadorequest

+0

또한 '백 슬래시'는 소켓 자체에서 추가되며 내 자체 객체에서는 추가되지 않습니다. 그것은 소켓이 문자열만을 전송하기 때문에 * (나는 생각한다) * args에 문자열만을 포함해야하기 때문이다. 브라우저에서 테스트를하면 콘솔에서 다음과 같은 결과를 얻습니다 :''{ "m": { "m": "__ 12", "a": { "field": "name", "min": 3 – Vadorequest

+0

WebSocket 자체는 데이터에 아무 것도 추가하지 않습니다. ","max ": 20} 네가 보내는 WebSocket을 통해 통신하기 위해 어떤 프레임 워크를 사용합니까? –

1

MMO의 경우 최소한의 데이터를 클라이언트에 보내야한다고 생각합니다. 소켓이 초 단위로 2xx/3xx라고 불리면 가능한 한 소켓을 통해 전송되는 데이터의 크기를 줄여야합니다.

다른 한편으로는, 또한 서버 측에서 객체를 암호화하여 객체의 축소 버전을 전송하는 리소스를 제공합니다 ... 축소하지 않고 객체를 축소하지 않는 것이 좋지 않을까요? 그것을 암호화하기 위해 자원을 소비하지 않습니까?

관련 문제