4

我想使用,但对其方法中的参数DataContractSerializer感到困惑-我看到我可以使用或。我想知道: StreamWriteObjectMemoryStreamXmlWriter

  • 流选择如何影响序列化?它会影响物体的大小吗?
  • 使用时MemoryStream,我总是得到一个二进制对象吗?

这些问题可能是基本的,但我一直在谷歌搜索,找不到明确的答案。谢谢。

4

2 回答 2

2

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 之类的东西。

于 2012-09-11T08:22:14.407 回答
1

正如 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.

于 2012-09-11T12:25:15.600 回答