나는 형식이다 내가 직렬화하고 TCP messages.The 클래스를 보낼 BinaryFormatter.Serialize 방법을 사용하고 끝을 :경우 BinaryFormatter는 TCP 메시지를 보내 - 확인 메시지
[Serializable]
public class Message {
public int senderId;
public int metaData;
public foo moreMetaData;
public object[] message;
}
내가 그, 일반적으로 알고 모든 메시지의 끝을 결정하는 방법은 세 가지가있다 :
- 앞 부분의 크기를 바이트 메시지
- 추가] 단부
- 고정 메시지 길이 바이트
세 번째 옵션은 끔찍한 생각처럼 보입니다. 두 번째 옵션을 사용하면 어떻게 스트림에 바이트를 추가 할 수 있으며 여전히 수신 측에서 BinaryFormatter.deserialize를 호출 할 수 있습니까? 첫 번째 옵션 (역방향으로 진행하는 것에 대해 유감스럽게 생각합니다)을 사용하면 옵션 2와 동일한 문제가 발생합니다 (선행을 제외하고). 직렬화하기 전에 직렬화 크기를 결정할 추가 문제가 있습니다. 두 번 직렬화하지 않고는 불가능합니다. 한 번은 더미 변수에 크기를 결정한 다음 다시 실제 스트림 버퍼에 넣습니다. 여기서 일반적으로 수행되는 작업은 무엇입니까?
그것을 할 수있는 방법의 예입니다 [1024]; buffer에서 내 메시지를 읽으려면 networkStream.ReadAsync (buf, 0, buf.Length); ' 을 기다려야합니다. BinaryFormatter.deserialize를 호출 할시기를 어떻게 결정합니까? – WreckFish
@WreckFish 다음 메시지 유형이 무엇인지 알려면 ReadAsync로만 읽은 다음 스트림을 Desearalize 함수에 전달합니다. 내 대답을 예제로 업데이트했습니다. –
감사합니다. 점점 더 명확 해지고 있습니다. 그러나 나는 그 예제에 대해 몇 가지 질문을 가지고있다. 'var read = await networkStream.ReadAsync (buffer, 0, 1) .ConfigureAwait (false); '후에 나머지 데이터가 수신되는 시점은 어떻게 결정됩니까? 나는 이것이'SynchronizationContext.Current'와'ConfigureAwait (false)'와 관련이 있다고 가정하고 있지만 이것들이 무엇인지 또는 무엇인지 이해하지 못합니다. 또한 왜 비동기 호출이 너무 많이 발생합니까? 일단 데이터가 수신되면 deserialize() 및 processFoo()와 같은 호출을 동 기적으로 수행 할 여유가 없습니까? – WreckFish