我想使用,但对其方法中的参数DataContractSerializer
感到困惑-我看到我可以使用或。我想知道: Stream
WriteObject
MemoryStream
XmlWriter
- 流选择如何影响序列化?它会影响物体的大小吗?
- 使用时
MemoryStream
,我总是得到一个二进制对象吗?
这些问题可能是基本的,但我一直在谷歌搜索,找不到明确的答案。谢谢。
我想使用,但对其方法中的参数DataContractSerializer
感到困惑-我看到我可以使用或。我想知道: Stream
WriteObject
MemoryStream
XmlWriter
MemoryStream
,我总是得到一个二进制对象吗?这些问题可能是基本的,但我一直在谷歌搜索,找不到明确的答案。谢谢。
DataContractSerializer
本质上是一个基于 xml 的序列化程序。如果传递 a Stream
,它将构造一个XmlWriter
(特别是 an XmlDictionaryWriter
)包装流,然后核心序列化代码写入XmlWriter
.
流选择如何影响序列化?它会影响物体的大小吗?
使用不同的Stream
实例不会影响内部发生的事情,但与传入 an 相比,这里可能会略有XmlWriter
不同,具体取决于编码是什么。如果传递 a Stream
,则DataContractSerializer
使用 UTF-8;但如果你通过它,XmlWriter
你可以指定不同的编码。
使用时
MemoryStream
,我总是得到一个二进制对象吗?
MemoryStream
是 a 的包装器byte[]
,是的:一旦你.ToArray()
之后调用,你就只有二进制文件。但是,它也是二进制的,也恰好是 xml。两者都可以。
如果您想要实际上是二进制的序列化(意思是:基本上是二进制序列化格式,而不是 xml / json / csv / 等),那么也许可以考虑像 protobuf-net 之类的东西。
正如 Marc 所说,如果您使用WriteObject
需要 a的重载Stream
,那么无论传入的实例类型如何,写入流的字节DataContractSerializer
都将包含 XML 文档的 UTF-8 编码文本Stream
。如果实例是a MemoryStream
,您最终会得到一个内存中的字节数组(因为这就是 MemoryStream ),但这些字节包含 UTF-8 编码的 XML 文本 - 通常不会将其描述为二进制表示。
如果你使用WriteObject
需要一个的重载XmlWriter
,你最终得到的完全取决于你XmlWriter
是什么类型,以及它是如何被初始化的。就DataContractSerializer
相关而言,它将XmlWriter
以适当的模式调用 的方法来描述表示对象状态的 XML 信息集。Infoset 的编码方式取决于XmlWriter
.
如果您有特殊要求,并且特别受虐,您可以实现自己的自定义XmlWriter
来执行任何类型的编码、压缩、加密,无论您喜欢什么。或者您可以传递一个XmlTextWriter
,它将为您提供 Infoset 的文本编码(如 Stream 重载),但具有更多用于控制字符编码和文本格式的选项。更常见的是,您将传递 a XmlDictionaryWriter
,然后根据您创建它的方式,您有各种编码选项。
这些选项包括 WCF 自己的 XML 信息集二进制编码:让您使用XmlDictionaryWriter.CreateBinaryWriter
. 由于 WCF 团队投入大量精力来设计一种高效的二进制表示以满足 WCF 的性能目标,我想,如果您可以确定结果是序列化的对象只需要由 .NET 代码反序列化。如果您需要基于公共标准的二进制表示,则可以考虑MTOM
使用XmlDictionaryWriter
.