序列化具有大字节数组的对象时使用SerializableAttribute或IXmlSerializable

本文关键字:SerializableAttribute IXmlSerializable 对象 字节 数组 字节数 序列化 | 更新日期: 2023-09-27 18:30:12

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

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

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

但是,当我只使用SerializableAttribute时会发生什么?.NET框架中的自动序列化机制是以块的形式写入数据(就像我手动做的那样),还是通过创建巨大的字符串来保存我用base64序列化的整个字节数组来杀死大型对象堆?序列化程序是否有效,或者我应该编写自己的序列化代码,以确保在没有不必要的开销的情况下编写数据?

序列化具有大字节数组的对象时使用SerializableAttribute或IXmlSerializable

使用Reflector对System.Xml.Serialization.XmlSerializer(和XmlSerializationWriter,以及System.Xml.Base64Encoder)进行一些快速解析,可以显示base64字节数组在转换时被分块。

"序列化程序是否有效,或者我应该编写自己的序列化代码,以确保在没有不必要的开销的情况下编写数据?"

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

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

相关文章:
  • 没有找到相关文章