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

时间:2012-04-04 14:45:09

标签: c# xml-serialization serializable ixmlserializable

在我最近与large object heap fragmentation的问题之后,我重新审视了一些可序列化的类。我经常做一些Xml序列化和序列化/反序列化包含大字节数组的对象。

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

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

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

1 个答案:

答案 0 :(得分:2)

使用Reflector快速了解System.Xml.Serialization.XmlSerializer(以及XmlSerializationWriter和System.Xml.Base64Encoder),可以看出base64字节数组在转换时会被分块。

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

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

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