Я использую Jon Skeet (отличный) порт Google Protocol Buffers для C#/.Net.
Для практики я написал фиктивное приложение для обмена мгновенными сообщениями, которое отправляет несколько сообщений через сокет. У меня есть определение сообщения следующим образом: -
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