在我最近遇到大对象堆碎片问题之后,我重新审视了我的一些可序列化类。我经常做一些 Xml 序列化和序列化/反序列化包含大字节数组的对象。
一般来说,我只使用 SerializableAttribute 并且不关心序列化细节,直到我真的需要一些特殊行为。然后我切换到 IXmlSerializable 接口,编写自己的序列化/反序列化代码。
当手动将字节数组序列化为 Xml 时,我更喜欢XmlWriter.WriteBase64(byte[] buffer, int index, int count)
和XmlReader.ReadElementContentAsBase64(byte[] buffer, int index, int count)
方法。这让我可以分块写入数据——非常方便。
但是当我只使用SerializableAttribute
? .NET 框架内的自动序列化机制是按块写入数据(就像我手动执行的那样),还是只是通过创建非常大的字符串来保存使用 base64 序列化的整个字节数组来杀死大型对象堆?序列化器是否高效,或者我应该编写自己的序列化代码以确保写入数据而没有不必要的开销?