Покрывающий поток в ByteString - PullRequest
1 голос
/ 21 марта 2019

У меня есть Stream, который мне нужно вернуть через сообщение protobuf как bytes. Как мне преобразовать Stream в ByteString, который ожидается? Это так же просто, как в документации Сериализация . Из-за характера проекта я не могу хорошо его протестировать, поэтому я работаю вслепую. Вот с чем я работаю:

Протокол буфера:

message ProtoResponse{
   bytes ResponseValue = 1;
}

C #

public ProtoResponse SendResponse(Stream stream)
{
   var response = ProtoResponse
      {
         // this obviously does not work but 
         // but it conveys the idea of what I am going for
         ResponseValue = stream
      }
   return response;
}

Я пытался преобразовать Stream в string или byte[], но VS продолжает выдавать ту же ошибку Cannot implicitly convert type '' to 'Google.Protobuf.ByteString'. Я знаю, что что-то упустил, и мои знания о Streams и protocol buffers отсутствуют.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

На самом деле, я мог ответить на свой вопрос. ByteString имеет расширение, которое принимает byte[].

public ProtoResponse SendResponse(Stream stream)
{
   byte[] b;
   using (var memoryStream = new MemoryStream())
   {
      stream.CopyTo(memoryStream);
      b = memoryStream.ToArray();
   }
   var response = ProtoResponse
      {
         ResponseValue = ByteString.CopyFrom(b)
      }
   return response;
}

Если кто-то видит что-то не так с этим, дайте мне знать! Спасибо!

0 голосов
/ 22 июля 2019

Я использую C #, а Protobuf syntax = 3; с GRPC. В моем случае это выглядит так:

Я нашел способ изменить изображение на ByteArray, этот пример здесь для понимания следующей части моего ответа.

private static byte[] ImageToByteArray(Bitmap image)
{
  using (var ms = new MemoryStream())
   {
     image.Save(ms, image.RawFormat);
     return ms.ToArray();
   }
}

Но затем я должен изменить Bytearray на ByteString из Protobuf3

byte[] img = ImageToByteArray(); //its method you can see above
ByteString bytestring;
 using (var str = new MemoryStream(img))
 {
    bytestring = ByteString.FromStream(str);
 }

Вы можете просто использовать ByteString.FromStream(MemoryStream) без CopyFrom метода.

Если мы посмотрим получателю этого сообщения, ему нужно изменить ByteString на ByteArray , чтобы, например, сохранить фотографию:

byte[] img = request.Image.ToByteArray(); //this is received message

И это все. У вас есть одинаковые байты с обеих сторон.

...