将内存流写入文件
Writing a memory stream to a file
我试过将 json 格式的数据作为字符串检索并将其写入文件,效果很好。现在,我正在尝试使用 MemoryStream 来做同样的事情,但没有任何内容写入文件 - 只有 [{},{},{},{},{}],没有任何实际数据。
我的问题是 - 如何检查数据是否确实正确进入内存流,或者问题是否出现在其他地方。我知道 myList 确实包含数据。
这是我的代码:
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(List<myClass>));
dcjs.WriteObject(ms, myList);
using (FileStream fs = new FileStream(Path.Combine(Application.StartupPath,"MyFile.json"), FileMode.OpenOrCreate))
{
ms.Position = 0;
ms.Read(ms.ToArray(), 0, (int)ms.Length);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
ms.Close();
fs.Flush();
fs.Close();
}
这一行看起来有问题:
ms.Read(ms.ToArray(), 0, (int)ms.Length);
此时您不需要将任何内容读入内存流,尤其是当您编写代码以将 ms 读入 ms 时。
我非常有信心只需删除此行即可解决您的问题。
有个很方便的方法,Stream.CopyTo(Stream)
。
using (MemoryStream ms = new MemoryStream())
{
StreamWriter writer = new StreamWriter(ms);
writer.WriteLine("asdasdasasdfasdasd");
writer.Flush();
//You have to rewind the MemoryStream before copying
ms.Seek(0, SeekOrigin.Begin);
using (FileStream fs = new FileStream("output.txt", FileMode.OpenOrCreate))
{
ms.CopyTo(fs);
fs.Flush();
}
}
此外,您不必关闭 fs
,因为它在 using 语句中,将在最后处理。
//重置流的位置
ms.Position = 0;
//然后复制到文件流
ms.CopyTo(fileStream);
问题与您的文件流/内存流无关。问题是 DataContractJsonSerializer
是一个 OPT IN Serializer。您需要将 [DataMemberAttribute]
添加到您需要在 myClass
.
上序列化的所有属性
[DataContract]
public class myClass
{
[DataMember]
public string Foo { get; set; }
}
using (var memoryStream = new MemoryStream())
{
...
var fileName = $"FileName.xlsx";
string tempFilePath = Path.Combine(Path.GetTempPath() + fileName );
using (var fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
{
memoryStream.WriteTo(fs);
}
}
我试过将 json 格式的数据作为字符串检索并将其写入文件,效果很好。现在,我正在尝试使用 MemoryStream 来做同样的事情,但没有任何内容写入文件 - 只有 [{},{},{},{},{}],没有任何实际数据。
我的问题是 - 如何检查数据是否确实正确进入内存流,或者问题是否出现在其他地方。我知道 myList 确实包含数据。
这是我的代码:
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(List<myClass>));
dcjs.WriteObject(ms, myList);
using (FileStream fs = new FileStream(Path.Combine(Application.StartupPath,"MyFile.json"), FileMode.OpenOrCreate))
{
ms.Position = 0;
ms.Read(ms.ToArray(), 0, (int)ms.Length);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
ms.Close();
fs.Flush();
fs.Close();
}
这一行看起来有问题:
ms.Read(ms.ToArray(), 0, (int)ms.Length);
此时您不需要将任何内容读入内存流,尤其是当您编写代码以将 ms 读入 ms 时。
我非常有信心只需删除此行即可解决您的问题。
有个很方便的方法,Stream.CopyTo(Stream)
。
using (MemoryStream ms = new MemoryStream())
{
StreamWriter writer = new StreamWriter(ms);
writer.WriteLine("asdasdasasdfasdasd");
writer.Flush();
//You have to rewind the MemoryStream before copying
ms.Seek(0, SeekOrigin.Begin);
using (FileStream fs = new FileStream("output.txt", FileMode.OpenOrCreate))
{
ms.CopyTo(fs);
fs.Flush();
}
}
此外,您不必关闭 fs
,因为它在 using 语句中,将在最后处理。
//重置流的位置
ms.Position = 0;
//然后复制到文件流
ms.CopyTo(fileStream);
问题与您的文件流/内存流无关。问题是 DataContractJsonSerializer
是一个 OPT IN Serializer。您需要将 [DataMemberAttribute]
添加到您需要在 myClass
.
[DataContract]
public class myClass
{
[DataMember]
public string Foo { get; set; }
}
using (var memoryStream = new MemoryStream())
{
...
var fileName = $"FileName.xlsx";
string tempFilePath = Path.Combine(Path.GetTempPath() + fileName );
using (var fs = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write))
{
memoryStream.WriteTo(fs);
}
}