Я использую Jon Skeet (превосходный) порт буферов протокола Google для C # /. Net.
Для практики я написал фиктивное приложение Instant Messenger, которое отправляет некоторые сообщения в сокет. У меня есть определение сообщения следующим образом: -
message InstantMessage {<br/>
required string Message = 1;<br/>
required int64 TimeStampTicks = 2; <br/>
}
Когда отправитель сериализует сообщение, он отправляет его действительно элегантно: -
...
InstantMessage.Builder imBuild = new InstantMessage.Builder();
imBuild.Message = txtEnterText.Text;
imBuild.TimeStampTicks = DateTime.Now.Ticks;
InstantMessage im = imBuild.BuildPartial();
im.WriteTo(networkStream);
...
Это прекрасно работает. Но на другом конце у меня проблемы с тем, чтобы заставить ParseFrom
работать.
Я хочу использовать: -
InstantMessage im = InstantMessage.ParseFrom(networkStream);
Но вместо этого мне пришлось прочитать его в байтах, а затем разобрать его отсюда. Это явно не идеально по ряду причин. Текущий код: -
while (true)
{
Byte[] byteArray = new Byte[10000000];
int intMsgLength;
int runningMsgLength = 0;
DateTime start = DateTime.Now;
while (true)
{
runningMsgLength += networkStream.Read(byteArray, runningMsgLength, 10000000 - runningMsgLength);
if (!networkStream.DataAvailable)
break;
}
InstantMessage im = InstantMessage.ParseFrom(byteArray.Take(runningMsgLength).ToArray());
Когда я пытаюсь использовать ParseFrom
, управление не возвращается к вызывающему методу, даже когда я знаю, что в сети есть действительное сообщение GB.
Любой совет будет принят с благодарностью,
PW