Как десериализовать прото, полученное в виде байта [] - PullRequest
2 голосов
/ 23 января 2012

Я использую среду Spring.Rest.

Если мы получим 402, тело будет содержать протокол, который в свою очередь будет содержать различную информацию об ошибках.

Исключение, созданное на 402, является экземпляром Spring.Rest.Client.HttpClientErrorException. Ответ в исключении является экземпляром Spring.HttpResponseMessage. Тело в ответе имеет тип byte []. Это означает, что у меня есть байт [], пока десериализатор ожидает поток.

Для десериализации прото, содержащегося в теле, я сделал следующее:

MemoryStream mStream = new MemoryStream();
mStream.Write(exception.Response.Body,0,exception.Response.Body.Length);
var proto = Serializer.Deserialize<XXXRestProtoException>(mStream);

когда я проверяю возвращенный прото, все его свойства равны нулю. Верен ли мой подход, или мне нужно сделать больше, прежде чем представлять Stream в методе десериализации?

Мы подтвердили, что определения прототипов, используемые на клиенте и сервере, синхронизированы, а тело хорошо сформировано на сервере.

Поток, созданный этим кодом, имеет ту же длину и содержимое, что и данный байт [], что, в свою очередь, соответствует заголовку content-length.

1 Ответ

0 голосов
/ 23 января 2012

Если вы Write в поток, то Position остается на конце потока;2 простых варианта:

  1. перемотка потока;между Write и Deserialize, введите:

    ms.Position = 0;
    
  2. Инициализируйте поток из BLOB-объекта:

    MemoryStream mStream = new MemoryStream(exception.Response.Body);
    

Я обычно использовал бы последнее.

...