Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

391
Views
MemoryStream.ToArray() devuelve una matriz vacía si StreamWriter no se desecha

Estoy tratando de obtener una matriz de bytes de mi modelo para ponerlo en el archivo. Tengo un método como tal:

 public static byte[] GetByteArray(List<MyModel> models) { using var ms = new MemoryStream(); using var sw = new StreamWriter(ms); foreach (var model in models) { sw.Write(model.Id + "," + model.Name); sw.WriteLine(); } sw.Dispose(); return ms.ToArray(); }

Este método funciona bien, pero como puede pensar, no necesito desechar StreamWriter manualmente, porque tengo una declaración de uso. Yo también lo pensé, pero cuando sw.Dispose(); el ms.ToArray(); devuelve una matriz vacía. ¿Alguien puede explicarme este comportamiento?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Tienes la línea:

 using var sw = new StreamWriter(ms);

Esto solo elimina el StreamWriter al final del método. Sin embargo, está llamando a ms.ToArray() antes del final del método. Esto significa que está llamando a ms.ToArray() antes de que se StreamWriter .

Sin embargo, StreamWriter está almacenando en búfer algunos datos internamente y solo los vacía a MemoryStream cuando se desechan. Por lo tanto, debe asegurarse de desechar StreamWriter antes de llamar a ms.ToArray() .

Probablemente sea más claro using la sintaxis de uso más antigua, que es explícita sobre cuándo ocurre la eliminación:

 public static byte[] GetByteArray(List<MyModel> models) { using var ms = new MemoryStream(); using (var sw = new StreamWriter(ms)) { foreach (var model in models) { sw.Write(model.Id + "," + model.Name); sw.WriteLine(); } } return ms.ToArray(); }
over 4 years ago · Santiago Trujillo Report

0

La disposición hace parte del trabajo. Enrojece al escritor. Utilice Flush() para descargarlo manualmente.

 public static byte[] GetByteArray(List<MyModel> models) { var ms = new MemoryStream(); using var sw = new StreamWriter(ms); foreach (var model in models) { sw.Write(model.Id + "," + model.Name); sw.WriteLine(); } // flush the writer, to make sure it is written to the stream. sw.Flush(); return ms.ToArray(); }

No es necesario que elimine el flujo de memoria, ya que StreamWriter se hace cargo.

No me gusta la construcción de que el streamwriter se apropia del flujo de memoria. Esto probablemente se deba a que el streamwriter también se puede usar directamente en un archivo. Un constructor que tiene una ruta de archivo como parámetro. (por lo que no se necesita ningún parámetro de flujo)

Constructor LeaveOpen de StreamWriter

over 4 years ago · Santiago Trujillo Report

0

Si escribe elementos List<MyModel> como cadenas, puede simplificar la conversión de la siguiente manera:

 public static byte[] GetByteArray(List<MyModel> models) => Encoding.UTF8.GetBytes(string.Join(Environment.NewLine, models.Select(model => $"{model.Id},{model.Name}")));

O use serializadores de terceros, como Newtonsoft.Json (ejemplo de aquí ):

 public static byte[] Serialize<T>(this T source) { var asString = JsonConvert.SerializeObject(source, SerializerSettings); return Encoding.Unicode.GetBytes(asString); } public static T Deserialize<T>(this byte[] source) { var asString = Encoding.Unicode.GetString(source); return JsonConvert.DeserializeObject<T>(asString); }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!