C#:DataContractSerializer和不同的流
我想使用C#:DataContractSerializer和不同的流,c#,stream,datacontractserializer,C#,Stream,Datacontractserializer,我想使用DataContractSerializer,但我对其WriteObject方法中的Stream参数感到困惑-我发现我可以使用MemoryStream或XmlWriter。我想知道: 流选择如何影响序列化?它会影响对象的大小吗 使用MemoryStream时,是否总是获得二进制对象 这些问题可能是基本的,但我一直在谷歌上搜索,找不到明确的答案。谢谢。DataContractSerializer本质上是一个基于xml的序列化程序。如果您传递一个流,它将构造一个包装该流的XmlWrite
DataContractSerializer
,但我对其WriteObject
方法中的Stream
参数感到困惑-我发现我可以使用MemoryStream
或XmlWriter
。我想知道:
- 流选择如何影响序列化?它会影响对象的大小吗李>
- 使用
时,是否总是获得二进制对象MemoryStream
这些问题可能是基本的,但我一直在谷歌上搜索,找不到明确的答案。谢谢。DataContractSerializer本质上是一个基于xml的序列化程序。如果您传递一个
流
,它将构造一个包装该流的XmlWriter
(具体地说,是一个xmldirectionarywriter
),然后核心序列化代码写入XmlWriter
流选择如何影响序列化?它会影响对象的大小吗
使用不同的流
实例不会影响内部发生的事情,但是
与传入XmlWriter
相比,这里可能有一些细微的区别,这取决于编码方式。如果您传递一个流
,那么DataContractSerializer
使用UTF-8;但是,如果向它传递一个XmlWriter
,则可以指定不同的编码
使用MemoryStream
时,是否总是获得二进制对象
MemoryStream
是对字节[]
的包装,是的:一旦调用了.ToArray()
,之后就只有二进制文件了。然而,碰巧也是xml的二进制文件。两者都可以
如果您要序列化实际上是二进制(意思是:基本上是二进制序列化格式,而不是XML/JSON/CSV/ETC),那么可以考虑像ToBuff.NET之类的东西。
< P>如贾景晖所说,如果您使用了DataContractSerializer
写入流的字节将包含XML文档的UTF-8编码文本,而不管传入的流
实例的类型如何。如果实例是MemoryStream
,则最终会得到内存中的字节数组(因为这就是MemoryStream),但这些字节包含UTF-8编码的XML文本,通常不会将其描述为二进制表示
如果使用WriteObject
的重载,它需要一个XmlWriter
,那么最终的结果完全取决于XmlWriter
的类型以及初始化方式。就DataContractSerializer
而言,它将以适当的模式调用XmlWriter
的方法来描述表示对象状态的XML信息集。信息集的编码方式取决于XmlWriter
的实现
如果您有专门的需求,并且特别受虐,那么您可以实现自己的定制XmlWriter
来执行任何类型的编码、压缩、加密,无论您喜欢什么。或者,您可以传递一个XmlTextWriter
,它将为您提供信息集的文本编码(如流重载),但具有更多用于控制字符编码和文本格式的选项。通常情况下,您会传递一个XmlDictionaryWriter
,然后根据您创建它的方式,您有各种编码选项
这些选项包括WCF自己的XML信息集二进制编码:以获得使用
XmlDictionaryWriter.CreateBinaryWriter
创建实例的效果。由于WCF团队投入了大量精力来设计高效的二进制表示以满足WCF的性能目标,我想,如果您能够确保生成的序列化对象只需要由.NET代码反序列化,您将很难想出更好的选择。如果你需要一个基于公共标准的二进制表示,你可以考虑“<代码> MTON/COD> <代码> XmlDictionaryWriter < /COD> .< /P>谢谢:)我想序列化一个对象,以便将它保存在DB中(我不确定我想要正常化)。关于何时使用二进制格式,是否有经验法则?序列化是否涉及任何解压缩?如何查看MemoryStream
的xml输出?@Noich要将内存流的内容视为xml,只需使用类似string s=Encoding.UTF8.GetString(ms.GetBuffer(),0,(int)ms.Length)的内容即可代码>。protobuf net不应用压缩(如:gzip、deflate等)-但是,它在存储内容方面非常有效,并且通常要小得多。如果您关心带宽和/或存储,但不需要人类可读,那么这将是一个合理的选择。