2012-05-23 2 views
0

그래서 기본 UDP 서버를 가지고 있는데, 바이트 배열을 복원하는 것과 같은 것들을 구현했습니다 (순서가 잘못되어 검색된 경우). Bassicaly, 클라이언트, 서버 및 클래스 라이브러리를 클라이언트에서 서버로 또는 그 반대로 보낼 수있는 유형의 클래스 라이브러리가 있습니다. 그래서 지금 나는 몇몇 객체들을 직렬화하고 server/client에게 보낼 아이디어를 얻었다. 하지만 제대로 deserialize하기 위해받은 객체의 유형을 알아야합니다. 이 문제를 해결하기 위해 두 가지 아이디어가 떠 올랐습니다.해시 값으로 유형을 식별하는 방법은 무엇입니까?

  • "악수"를하십시오. 어떤 객체가 전송 될지, 길이, 클래스 이름 등에 대한 데이터를 전송하고, 실제 데이터를 검색하고 역 직렬화 한 후에 데이터를 전송합니다. 나는 그것을 알고 있지만 UDP이기 때문에이 "핸드 셰이크"가 손실 될 수 있으므로 다시 요청해야하므로 논리와 네트워크 과다 사용이 복잡하지만이 방법을 알고 있습니다.
  • 두 번째 것은 해시 값에 따라 유형을 식별합니다. 따라서 클라이언트는 데이터 형식의 해시 값과 데이터 조각을 포함하는 데이터를 보냅니다 (예를 들어, 내 형식의 개체 만 전송하므로 C# 및 Framework 형식을 구현할 필요가 없음). 그리고이 해시 값으로 서버 유형을 결정해야합니다. 적절하게 그것을 deserealize.

그렇다면 아이디어를 구현하는 방법은 무엇입니까? 그것은 천천히 있기 때문에 반사를 피할 수 있다면 그것은 완벽 할 것입니다 (나는 더 빨리 작동하면 거대한 switch 문을 신경 쓰지 않습니다)

+0

UDP를 통해 바이트를 전송할 때 자신의 프로토콜이 있다고 가정합니다. 따라서 예약 된 바이트 또는 두 개를 사용하여 어떤 유형의 개체를 보내고 받고 있는지 확인할 수 있습니다. 그것은 당신에게 달려 있습니다. – BeemerGuy

+0

아니오, 단지 standart [이진 serialization] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx)이 순간에 – dantix

+0

아이디어는 여전히 나타납니다 : 당신 들어오는 신호를 알리기 위해 객체 앞에 serialize 된 Type을 보낼 수 있습니다. –

답변

0

내가 작업 한 프로토 타입에 대해 오늘이 작업을 수행했습니다. 따라서 메시지 스트림을 정의했습니다.

처음 4 바이트 : Int32로 어셈블리 한정 형식 이름의 길이.

다음 n 바이트 (여기서 n은 처음 4 바이트로 지정) : 유형의 어셈블리 규정 이름.

나머지 메시지 : 일련 번호가 지정된 개체

그것은 매력처럼 작동했습니다.

+0

리플렉션을 사용하여 필요한 유형으로 캐스팅을 입력 하시겠습니까? – dantix

+1

@Dantix 캐스팅은 정적 인 컴파일 타임 개념입니다. 런타임에만 알 수있는 유형을 캐스팅 할 수 없습니다. 어떤 상황에 캐스팅이 필요한지 상상하고 있습니까? 'object'보다 더 구체적인 타입을 취하는 메소드를 호출한다면, 리플렉션을 사용하여 그 메소드를 호출해야 할 것입니다. 'MethodInfo'에서'Invoke'를 호출하면, 인수는'object' 배열로 전달됩니다; 런타임 유형 검사가 있지만 정적 캐스트는 없습니다. – phoog

+1

또한 메시지 길이의 int 값을 추가하여 전체 메시지 또는 일부만 검색했는지 확인합니다. – dantix

0

그냥 객체 데이터의 일부분을 객체 데이터로 만들고 정확하게 같은 것을 사용하여 보내십시오. 논리. 네트워크 수준에서 개별적으로 처리하지 마십시오.

+0

deseriliazing하기 전에 유형을 알아야합니다. – dantix

+0

맞습니다. 따라서 네트워크 계층에는 문제가되지 않습니다. –

관련 문제