我正在嘗試從我的模型中獲取位元組陣列以將其放入檔案中。我有一個方法:
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();
}
這種方法作業正常,但我可能認為我不需要手動處理StreamWriter,因為我有一個 using 陳述句。我想為好,但如果我洗掉sw.Dispose();了ms.ToArray();回傳一個空陣列。有人可以向我解釋這種行為嗎?
uj5u.com熱心網友回復:
你有這條線:
using var sw = new StreamWriter(ms);
這只StreamWriter在方法的末尾處理。但是,您在方法結束ms.ToArray() 之前呼叫。這意味著您在處理ms.ToArray()之前呼叫StreamWriter。
但是,它StreamWriter正在內部緩沖一些資料,并且僅MemoryStream在處理它時將其重繪 到。因此,您需要確保StreamWriter 在呼叫之前處理ms.ToArray()。
使用舊using語法可能更清楚,它明確說明了何時發生處置:
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();
}
uj5u.com熱心網友回復:
處置完成了部分作業。它使作家臉紅。用于Flush()手動沖洗。
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();
}
您不需要處理記憶體流,因為 StreamWriter 擁有所有權。
我不喜歡流撰寫器擁有記憶體流的構造。這可能是因為流撰寫器也可以直接在檔案上使用。一個以檔案路徑作為引數的建構式。(所以不需要流引數)
StreamWriter leaveOpen 建構式
uj5u.com熱心網友回復:
如果將List<MyModel>專案撰寫為字串,則可以通過以下方式簡化轉換:
public static byte[] GetByteArray(List<MyModel> models) =>
Encoding.UTF8.GetBytes(string.Join(Environment.NewLine,
models.Select(model => $"{model.Id},{model.Name}")));
或者使用第三方序列化程式,例如來自Newtonsoft.Json(來自此處的示例):
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);
}
uj5u.com熱心網友回復:
正如其他人所提到的,您必須重繪 StreamWriter
這是您的功能的樣子:
public static byte[] GetByteArray(List<MyModel> models)
{
MemoryStream memoryStream = new MemoryStream();
try
{
StreamWriter streamWriter = new StreamWriter(memoryStream);
try
{
List<MyModel>.Enumerator enumerator = models.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
MyModel current = enumerator.Current;
streamWriter.Write(string.Concat(current.Id, ",", current.Name));
streamWriter.WriteLine();
}
}
finally
{
((IDisposable)enumerator).Dispose();
}
streamWriter.Dispose();
return memoryStream.ToArray();
}
finally
{
if (streamWriter != null)
{
((IDisposable)streamWriter).Dispose();
}
}
}
finally
{
if (memoryStream != null)
{
((IDisposable)memoryStream).Dispose();
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373567.html
下一篇:如何獲得我的經理?
