1

在我最近遇到大对象堆碎片问题之后,我重新审视了我的一些可序列化类。我经常做一些 Xml 序列化和序列化/反序列化包含大字节数组的对象。

一般来说,我只使用 SerializableAttribute 并且不关心序列化细节,直到我真的需要一些特殊行为。然后我切换到 IXmlSerializable 接口,编写自己的序列化/反序列化代码。

当手动将字节数组序列化为 Xml 时,我更喜欢XmlWriter.WriteBase64(byte[] buffer, int index, int count)XmlReader.ReadElementContentAsBase64(byte[] buffer, int index, int count)方法。这让我可以分块写入数据——非常方便。

但是当我只使用SerializableAttribute? .NET 框架内的自动序列化机制是按块写入数据(就像我手动执行的那样),还是只是通过创建非常大的字符串来保存使用 base64 序列化的整个字节数组来杀死大型对象堆?序列化器是否高效,或者我应该编写自己的序列化代码以确保写入数据而没有不必要的开销?

4

1 回答 1

2

使用 Reflector 对 System.Xml.Serialization.XmlSerializer(以及 XmlSerializationWriter 和 System.Xml.Base64Encoder)的一些快速探索表明,base64 字节数组在转换时被分块。

“序列化器效率高,还是我应该编写自己的序列化代码以确保写入数据时没有不必要的开销?”

“高效”不是二元条件;这是一个连续体。您真正的问题是“它对我的需要是否足够有效?”,答案取决于您的需要。很可能您只需要在 XmlSerializer 和您的自定义代码之间运行一些测试,看看哪些在对您最重要的性能维度上表现更好。

PS XmlSerializer 不使用 SerializableAttribute;它只是序列化所有公共读/写属性。只有 System.Xml.Serialization 中的 Xml*Attributes 会影响 XmlSerializer(当然还有 IXmlSerializable)。

于 2012-04-04T15:02:26.730 回答