C# 将内存流写入文件

C# 将内存流写入文件,c#,json,memorystream,C#,Json,Memorystream,我曾尝试以json格式作为字符串检索数据并将其写入文件,效果非常好。现在我尝试使用MemoryStream做同样的事情,但是没有任何东西被写入到文件中——仅仅[{},{},{},{},{},{}],没有任何实际数据 我的问题是-如何检查数据是否确实正确地进入内存流,或者问题是否发生在其他地方。我知道myList确实包含数据 这是我的密码: MemoryStream ms = new MemoryStream(); DataContractJsonSerializer dcjs = new Dat

我曾尝试以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();
 }
MemoryStream ms=newmemoryStream();
DataContractJsonSerializer dcjs=新的DataContractJsonSerializer(类型(列表));
WriteObject(ms,myList);
使用(FileStream fs=newfilestream(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);
Close女士();
fs.Flush();
fs.Close();
}

这一行看起来有问题:

ms.Read(ms.ToArray(), 0, (int)ms.Length);
此时,您不需要将任何内容读入内存流,特别是当您编写将ms读入ms的代码时


我很有信心,只要删除这一行就可以解决您的问题。

有一个非常方便的方法,
Stream.CopyTo(Stream)


另外,您不必关闭fs,因为它位于using语句中,并将在末尾进行处理。

//重置流的位置

ms.Position = 0;
//然后复制到文件流

ms.CopyTo(fileStream);

问题与文件流/内存流无关。问题在于
DataContractJsonSerializer
是一个选择性加入序列化程序。您需要将
[DataMemberAttribute]
添加到需要在
myClass
上序列化的所有属性中

[DataContract]
public class myClass
{
     [DataMember]
     public string Foo { get; set; }
}

不是说这会修复你的问题,而是考虑通过使用.<代码> MS.Read(TuraRayle(),0,(int)Ms长度)来清理代码;code>为什么要读取内存流,覆盖dcjs.WriteObject放入其中的内容?这似乎是您的问题所在,不要重置流位置并重写自身。为什么要在文件流之前写入MemoryStream?但是使用.NET4.0,您应该可以访问
Stream.CopyTo(Stream)
。我尝试了ms.CopyTo(fs),但得到了相同的结果result@ElenaDBA问题不在于你写的文件。问题出在序列化程序中。在我尝试ms.WriteTo(fs)之前,结果是相同的。没有理由重置流位置,只需调用
ms.ToArray()
将整个内存流(从零开始)复制到数组中。在文档中,“将流内容写入字节数组,而不考虑位置属性。”什么都没有发生-文件未更改。通过修改更新代码,您需要使用Seek(0,SeekOrigin.Begin)我使用的是.Net Framework 3.5,因此这可能与此有关,但我可以使用
stream.CopyTo(stream)
,因为它不存在。相反,我必须使用
Stream.WriteTo(Stream)
。您可以使用ms.Position=0来“倒带”流,而不是ms.Seek(0,SeekOrigin.Begin)
[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);
     }

 }