C# 编写压缩XML文档并对其进行跟踪的有效方法&x27;s当前大小

C# 编写压缩XML文档并对其进行跟踪的有效方法&x27;s当前大小,c#,xml,filestream,memorystream,gzipstream,C#,Xml,Filestream,Memorystream,Gzipstream,我的应用程序生成压缩(gzip)xml消息,通过https传输到Web服务器。它通过TCP/IP每秒从客户端应用程序接收多达10000个数据包。每个数据包的大小可以是500到2000字节。它应该根据数据包元数据将接收到的数据包添加到集合中相应的xml消息中。当特定消息的长度达到指定的限制(例如1024Kb)时,应将其保存到指定文件夹中的文件中,然后从该文件夹发送到web服务器 正确/有效的方法是什么 我正在考虑两种方法: 1) GZipStream>FileStream 动态地将每个数据包直接写

我的应用程序生成压缩(gzip)xml消息,通过https传输到Web服务器。它通过TCP/IP每秒从客户端应用程序接收多达10000个数据包。每个数据包的大小可以是500到2000字节。它应该根据数据包元数据将接收到的数据包添加到集合中相应的xml消息中。当特定消息的长度达到指定的限制(例如1024Kb)时,应将其保存到指定文件夹中的文件中,然后从该文件夹发送到web服务器

正确/有效的方法是什么

我正在考虑两种方法:

1) GZipStream>FileStream 动态地将每个数据包直接写入相应的文件,并观察其大小。但我不确定如此频繁的写入是否好,我希望尽可能降低文件系统的工作负载

2) GZipStream>MemoryStream>文件 使用内存作为消息缓冲区。在这种情况下,我应该为每条消息创建一个MemoryStream,并在添加数据包时保持其打开状态。但在这种情况下,我不知道如何在不关闭内存流的情况下获取内存流的当前长度

例如: 我只能在ms.close()调用之后才能获得ms.Length


我已经编辑了你的标题。请参阅“”,其中一致意见是“不,他们不应该”。您的
MemoryStream
GZipStream
XmlWriter
都需要在
中使用
块,以确保正确处理它们,特别是在出现异常的情况下。@johnsaunder感谢您的评论。我读了。:)什么意思?关闭
MemoryStream
后才能获得它的长度
ms.Length
始终返回其中包含的字节数。此外,使用TCP/IP,您不会谈论数据包,它是一种流协议。@C.evenhui您对TCP的看法是正确的。在我的例子中,“数据包”是通过TCP发送的序列化对象,在数据的末尾带有指定的标记。
var ms = new MemoryStream();
var gstream = new GZipStream(ms, CompressionMode.Compress);
var writer = XmlWriter.Create(gstream);

writer.WriteStartElement("x", "root", "123");
writer.WriteElementString("packet_ID", "some data");
writer.WriteEndElement();                                   

writer.Close();
gstream.Close();
ms.Close();

Console.WriteLine("Memory size: " + ms.ToArray().Length);            
Console.ReadLine();