DeflateStream& MemoryStream的? [英] DeflateStream & MemoryStream?

查看:72
本文介绍了DeflateStream& MemoryStream的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述




我正在尝试Compress&解压缩数据集。

运行此代码时,我收到错误:


System.Xml.XmlException未处理

消息="根元素缺失。

Source =" System.Xml"


代码:


DataSet dsDataOrginal = new DataSet();

DataSet dsDataAfterDecompress = new DataSet();

dsDataOrginal.ReadXml(@" C:\ VSProjects2005 \ ZIP_Comp ress \ TheXML.XML");


//压缩到内存

MemoryStream MS = new MemoryStream();

DeflateStream dfs = new DeflateStream(MS,

CompressionMode.Compress,false);

dsDataOrginal.WriteXml(ms,XmlWriteMode.WriteSchema);


//从内存中解压缩

MS.Position = 0;

DeflateStream dfsDecompress = new DeflateStream(MS,

CompressionMode.Decompress ,false);

dsAfterDecompress.ReadXml(MS);

感谢您的帮助,

Asaf

解决方案

Asaf,

您的代码似乎给人的印象是你认为压缩后的数据集仍然是一个数据集。它不是。


另外,使用比xml更紧凑的二进制格式你会得到更好的服务。

这是一篇简短的文章,其中包含说明该技术的代码:

http://www.eggheadcafe.com/articles/20060220.asp


彼得

-

联合创始人,Eggheadcafe.com开发者门户网站:
http:// www。 eggheadcafe.com

UnBlog:
http:/ /petesbloggerama.blogspot.com


" Asaf"写道:



我正在努力压缩&解压缩数据集。
运行此代码时,我收到错误:

System.Xml.XmlException未处理
消息=根元素丢失。
Source =" System.Xml"

代码:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();

dsDataOrginal.ReadXml(@" C:\ VSProjects2005 \ZIP_Comp ress \TheXML.XML");

//压缩到内存
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress,false);
dsDataOrginal.WriteXml(ms,XmlWriteMode.WriteSchema);

//从内存中解压缩
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress,false);
dsAfterDecompress.ReadXml(MS) ;

感谢您的帮助,
Asaf



Asaf< AG ** @newsgroups.nospam>写道:

我正在尝试压缩&解压缩数据集。
运行此代码时,我收到错误:

System.Xml.XmlException未处理
消息=根元素丢失。
Source =" System.Xml"

代码:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();

dsDataOrginal.ReadXml(@" C:\ VSProjects2005 \ZIP_Comp ress \TheXML.XML");

//压缩到内存
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress,false);
dsDataOrginal.WriteXml(ms,XmlWriteMode.WriteSchema);

//从内存中解压缩
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress,false);
dsAfterDecompress.ReadXml(MS) ;



你永远不会使用放气或充气流。你应该是

调用

WriteXml(dfs,XmlWriteMode.WriteSchema)。


然后你应该在使用MemoryStream之前刷新dfs 。在那之后,

你应该可以调用ReadXml但是使用dfsDecompress而不是

MS。


我有点儿我们担心,如果没有关闭DeflateStream,那么可能会出现问题。您可能需要关闭dfs而不是刷新它,然后从第一个MemoryStream创建一个带有字节数组

的新MemoryStream,这样就知道它在哪里正常结束。


-

Jon Skeet - < sk *** @ pobox.com>
http://www.pobox.com/~skeet 博客: http://www.msmvps.com/jon.skeet

如果回复该群组,请不要给我发邮件


嗨Peter,嗨Jon,


感谢您的回复。

让我们重新开始:-)

使用FileStream时,以下代码工作正常:


//压缩并保存文件到磁盘

FileStream msf = new

FileStream(@" C:\ VSProjects2005 \ZIP_Compress \ TheXML .xmd",

FileMode.Create,FileAccess.Write);

dfs = new DeflateStream(msf,CompressionMode.Compress,false);

dsOrginal.WriteXml(dfs);


dfs.Close();

msf.Close();


MessageBox.Show("压缩到文件,完成!);


//从磁盘读取压缩文件,解压缩数据并显示行

计数数据集

FileStream infile = new

FileStream(@" C:\ VSProjects2005 \ZIP_Compress \ TheXML .xmd",FileMode.Open,

FileAccess.Read);

DeflateStream DefStream = new DeflateStream(infile,

CompressionMode.Decompress,false);

dsAfterDecompress.ReadXml(DefStream);

infile.Close();


textBox1.Text = dsAfterDecompress.Tables [0] .Rows.Count.ToString();

相同的代码,但使用MemoryStream不起作用:


DataSet dsDataOrginal = new DataSet();

DataSet dsDataAfterDecompress = new DataSet();

dsDataOrginal.ReadXml(@" C: \\ VSProjects2005 \ZIP_Comp ress \ TheXML.XML");


//压缩到内存

MemoryStream MS = new MemoryStream();

DeflateStream dfs = new DeflateStream(MS,

CompressionMode.Compress,false);

dsDataOrginal.WriteXml(dfs);

dfs.Close();


//从内存中解压缩

DeflateStream dfsDecompress = new DeflateStream(MS,

CompressionMode。解压缩,false);

dsAfterDecompress.ReadXml(dfsDecompress);


textBox1.Text = dsAfterDecompress.Tables [0] .Rows.Count.ToString() ;


如果使用dfs.Close();然后我收到错误:

"基本流不可读。

参数名称:stream"


如果dfs.Close();省略然后我收到错误:

根元素丢失在尝试时:

dsAfterDecompress.ReadXml(dfsDecompress);我的猜测是因为Stream在结束位置是
但是Position属性不能用于DeflateStream所以

我无法将DeflateStream倒回到零位置在做之前

dsAfterDecompress.ReadXml(dfsDecompress);


请帮助!


问候,

Asaf


" Jon Skeet [C#MVP]"写道:

Asaf< AG ** @newsgroups.nospam>写道:

我正在尝试压缩&解压缩数据集。
运行此代码时,我收到错误:

System.Xml.XmlException未处理
消息=根元素丢失。
Source =" System.Xml"

代码:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();

dsDataOrginal.ReadXml(@" C:\ VSProjects2005 \ZIP_Comp ress \TheXML.XML");

//压缩到内存
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress,false);
dsDataOrginal.WriteXml(ms,XmlWriteMode.WriteSchema);

//从内存中解压缩
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress,false);
dsAfterDecompress.ReadXml(MS) ;


你永远不会使用放气或充气流。你应该
调用WriteXml(dfs,XmlWriteMode.WriteSchema)。

然后你应该在使用MemoryStream之前刷新dfs。在那之后,你应该可以调用ReadXml但是使用dfsDecompress而不是MS。

我有点担心没有关闭DeflateStream来
一开始,可能会有问题。您可能需要关闭dfs而不是刷新它,然后从第一个MemoryStream创建一个带有字节数组
的新MemoryStream,这样才能知道它在哪里正常结束。
-
Jon Skeet - < sk *** @ pobox.com>
http://www.pobox.com/~skeet 博客: http://www.msmvps.com/jon.skeet
如果回复小组,请不要给我发邮件


Hi,

I am trying to Compress & Decompress a DataSet.
When running this code I am receiving the error:

System.Xml.XmlException was unhandled
Message="Root element is missing."
Source="System.Xml"

The code:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();
dsDataOrginal.ReadXml(@"C:\VSProjects2005\ZIP_Comp ress\TheXML.XML");

//Compressing to Memory
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress, false);
dsDataOrginal.WriteXml(ms, XmlWriteMode.WriteSchema);

//DeCompressing from Memory
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress, false);
dsAfterDecompress.ReadXml(MS);
Thanks for any help,
Asaf

解决方案

Asaf,
your code seems to give the impression that you think a dataset,after being
compressed ,is "still a dataset". It is not.

Also, you will be better served by using the binary format which is much
more compact than xml.
Here is a short article with code that illustrates the technique:

http://www.eggheadcafe.com/articles/20060220.asp

Peter
--
Co-founder, Eggheadcafe.com developer portal:
http://www.eggheadcafe.com
UnBlog:
http://petesbloggerama.blogspot.com


"Asaf" wrote:

Hi,

I am trying to Compress & Decompress a DataSet.
When running this code I am receiving the error:

System.Xml.XmlException was unhandled
Message="Root element is missing."
Source="System.Xml"

The code:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();
dsDataOrginal.ReadXml(@"C:\VSProjects2005\ZIP_Comp ress\TheXML.XML");

//Compressing to Memory
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress, false);
dsDataOrginal.WriteXml(ms, XmlWriteMode.WriteSchema);

//DeCompressing from Memory
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress, false);
dsAfterDecompress.ReadXml(MS);
Thanks for any help,
Asaf



Asaf <AG**@newsgroups.nospam> wrote:

I am trying to Compress & Decompress a DataSet.
When running this code I am receiving the error:

System.Xml.XmlException was unhandled
Message="Root element is missing."
Source="System.Xml"

The code:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();
dsDataOrginal.ReadXml(@"C:\VSProjects2005\ZIP_Comp ress\TheXML.XML");

//Compressing to Memory
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress, false);
dsDataOrginal.WriteXml(ms, XmlWriteMode.WriteSchema);

//DeCompressing from Memory
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress, false);
dsAfterDecompress.ReadXml(MS);



You''re never using the deflating or inflating streams. You should be
calling
WriteXml (dfs, XmlWriteMode.WriteSchema).

You should then Flush dfs before using the MemoryStream. After that,
you should be able to call ReadXml but with dfsDecompress rather than
MS.

I''m slightly concerned that without having closed the DeflateStream to
start with, there may be problems. You may need to close dfs instead of
just flushing it, then create a new MemoryStream with the byte array
from the first MemoryStream, just so it knows where it ends properly.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too


Hi Peter, Hi Jon,

Thanks for your reply.

Let''s start again :-)
The code below is working fine when using FileStream:

//Compress to and save the file to disk
FileStream msf = new
FileStream(@"C:\VSProjects2005\ZIP_Compress\TheXML .xmd",
FileMode.Create, FileAccess.Write);
dfs = new DeflateStream(msf, CompressionMode.Compress, false);
dsOrginal.WriteXml(dfs);

dfs.Close();
msf.Close();

MessageBox.Show("Compress to file, Done!");

//Read Compressed file from disk, decompress data and show rows
count for dataset
FileStream infile = new
FileStream(@"C:\VSProjects2005\ZIP_Compress\TheXML .xmd", FileMode.Open,
FileAccess.Read);
DeflateStream DefStream = new DeflateStream(infile,
CompressionMode.Decompress, false);
dsAfterDecompress.ReadXml(DefStream);
infile.Close();

textBox1.Text = dsAfterDecompress.Tables[0].Rows.Count.ToString();
Same code but using MemoryStream does not work:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();
dsDataOrginal.ReadXml(@"C:\VSProjects2005\ZIP_Comp ress\TheXML.XML");

//Compressing to Memory
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress, false);
dsDataOrginal.WriteXml(dfs);
dfs.Close();

//DeCompressing from Memory
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress, false);
dsAfterDecompress.ReadXml(dfsDecompress);

textBox1.Text = dsAfterDecompress.Tables[0].Rows.Count.ToString();

If using dfs.Close(); then I am getting the error:
"The base stream is not readable.
Parameter name: stream"

If dfs.Close(); is omitted then I am getting the error:
"Root element is missing" when trying to do:
dsAfterDecompress.ReadXml(dfsDecompress); my guess is because the Stream is
at the end Position but Position property can''t be use with DeflateStream so
I can''t rewind the DeflateStream to zero position before doing
dsAfterDecompress.ReadXml(dfsDecompress);

Help Please!

Regards,
Asaf

"Jon Skeet [C# MVP]" wrote:

Asaf <AG**@newsgroups.nospam> wrote:

I am trying to Compress & Decompress a DataSet.
When running this code I am receiving the error:

System.Xml.XmlException was unhandled
Message="Root element is missing."
Source="System.Xml"

The code:

DataSet dsDataOrginal = new DataSet();
DataSet dsDataAfterDecompress = new DataSet();
dsDataOrginal.ReadXml(@"C:\VSProjects2005\ZIP_Comp ress\TheXML.XML");

//Compressing to Memory
MemoryStream MS = new MemoryStream();
DeflateStream dfs = new DeflateStream(MS,
CompressionMode.Compress, false);
dsDataOrginal.WriteXml(ms, XmlWriteMode.WriteSchema);

//DeCompressing from Memory
MS.Position = 0;
DeflateStream dfsDecompress = new DeflateStream(MS,
CompressionMode.Decompress, false);
dsAfterDecompress.ReadXml(MS);



You''re never using the deflating or inflating streams. You should be
calling
WriteXml (dfs, XmlWriteMode.WriteSchema).

You should then Flush dfs before using the MemoryStream. After that,
you should be able to call ReadXml but with dfsDecompress rather than
MS.

I''m slightly concerned that without having closed the DeflateStream to
start with, there may be problems. You may need to close dfs instead of
just flushing it, then create a new MemoryStream with the byte array
from the first MemoryStream, just so it knows where it ends properly.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too



这篇关于DeflateStream&amp; MemoryStream的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆