ISerializable对象应该如何存储二进制数据?

时间:2013-11-17 02:31:03

标签: .net serializable

我有一个引用类型,它包含非托管内存中的原始图像数据。很清楚如何使用SerializationInfo存储元数据(宽度,高度),但存储BLOB的最佳方法是什么?

我唯一能看到的就是使用Convert.ToBase64String,这需要一大堆复制。有更简单的方法吗?

1 个答案:

答案 0 :(得分:2)

更新:有一个更好的方法来处理这个!

您需要做的是查看传递给GetObjectData的{​​{3}},StreamingContext属性可以告诉您正在发生什么类型的序列化。如果您通过状态CloneCrossAppDomain,则可以重用现有的非托管blob句柄,并将句柄指针传递给SerializationInfo对象。


无论您选择什么,都需要进行大量复制,但不需要Convert.ToBase64String,您只需序列化您传入byte[]的托管Convert.ToBase64String即可应该没问题。


我不知道byte[]是否有任何特殊情况效率,但转移过程中的所有Seralizations StreamingContext.State。因此,通过在Base64中进行编码,您将要进行

  1. 阅读您的非托管blob并将其转换为托管byte[]
  2. 通过byte[]string转换为ToBase64String(将尺寸增加 4 / 3 到期编码)
  3. 将带有标记名称的编码字符串传递给SerializationInfo
  4. 将剩余的元数据传递给SerializationInfo及其重复标记
  5. 序列化程序获取所有标记+对象组合并将它们转换为字节流以传递到目标
  6. 反序列化器获取字节流并将其重新转换为标签和对象的集合
  7. 您使用相同的标记名称
  8. 返回string
  9. 您可以使用保存下来的标记获取元数据。
  10. 通过string
  11. byte[]转换回FromBase64String
  12. byte[]转换回非托管二进制blob。
  13. 如果您从未编码为字符串并且仅将byte[]作为对象传递给SerializationInfo对象,则步骤几乎相同,它只是没有 4 < / sup> / 3 datablob的大小增加,将二进制数据编码为文本。

    1. 阅读您的非托管blob并将其转换为托管byte[]
    2. 将带有标记名称的byte[]传递到SerializationInfo
    3. 将剩余的元数据传递给SerializationInfo及其重复标记
    4. 序列化程序获取所有标记+对象组合并将它们转换为字节流以传递到目标
    5. 反序列化器获取字节流并将其重新转换为标签和对象的集合
    6. 您使用相同的标记名称
    7. 返回byte[]
    8. 您可以使用保存下来的标记获取元数据。
    9. byte[]转换回非托管二进制blob。
    10. 所以我猜“优化”正在传输,因为byte[]的好处是不会增加你必须传输给desearizer的数据量。