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>如贾景晖所说,如果您使用了Load Objult的超载,则使用<代码>流< /代码>,然后,由
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等)-但是,它在存储内容方面非常有效,并且通常要小得多。如果您关心带宽和/或存储,但不需要人类可读,那么这将是一个合理的选择。