StreamReader возвращает ноль - PullRequest
2 голосов
/ 12 апреля 2020

Моя цель - начать использовать Stream для чтения содержимого HTTP (HttpResponseMessage.Content). На данный момент я использую ReadAsStringAsync для чтения содержимого, и я хотел бы улучшить производительность и использование памяти с помощью ReadAsStreamAsync.

. Чтобы добиться этого, я построил небольшой блок test, который должен организовать Stream, а затем прочитать его и преобразовать в исходный объект.

Ожидаемый результат должен быть исходным объектом после десериализации, но он возвращает ноль.

// Arrenge
List<TypiCode> typiCodes = new List<TypiCode>()
{
    new TypiCode()
    {
        Completed = true,
        Id = this._random.Next(1000),
        Title = Guid.NewGuid().ToString(),
        UserId = this._random.Next(1000)
    }
};

var jsonSerializer = new JsonSerializer();

Stream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
JsonTextWriter jsonWriter = new JsonTextWriter(writer);
jsonSerializer.Serialize(jsonWriter, typiCodes);
jsonWriter.Flush();

// Act
List<TypiCode> result = null;
using (var streamReader = new StreamReader(stream))
{
    using (JsonTextReader jsonTextReader = new JsonTextReader(streamReader))
    {                      
        result = jsonSerializer.Deserialize<List<TypiCode>>(jsonTextReader);
    }
}

//Assert
Assert.IsNotNull(result); --> Failed!

Модель:

[Serializable]
public class TypiCode
{
    public int UserId { get; set; }
    public int Id { get; set; }
    public string Title { get; set; }
    public bool Completed { get; set; }
}

Почему StreamReader возвращает ноль?

1 Ответ

3 голосов
/ 12 апреля 2020

После записи в поток вы отстаете от данных. Вам нужно снова начать его.

Сбросить положение потоков:

// your code

Stream stream = new MemoryStream();
StreamWriter writer = new StreamWriter(stream);
JsonTextWriter jsonWriter = new JsonTextWriter(writer);
jsonSerializer.Serialize(jsonWriter, typiCodes);
jsonWriter.Flush();

stream.Seek(0, SeekOrigin.Begin);

// more of youre code

Доку:

...