我有一个引用类型,它包含非托管内存中的原始图像数据。很清楚如何使用SerializationInfo
存储元数据(宽度,高度),但存储BLOB的最佳方法是什么?
我唯一能看到的就是使用Convert.ToBase64String
,这需要一大堆复制。有更简单的方法吗?
答案 0 :(得分:2)
更新:有一个更好的方法来处理这个!
您需要做的是查看传递给GetObjectData
的{{3}},StreamingContext
属性可以告诉您正在发生什么类型的序列化。如果您通过状态Clone
或CrossAppDomain
,则可以重用现有的非托管blob句柄,并将句柄指针传递给SerializationInfo
对象。
无论您选择什么,都需要进行大量复制,但不需要Convert.ToBase64String
,您只需序列化您传入byte[]
的托管Convert.ToBase64String
即可应该没问题。
我不知道byte[]
是否有任何特殊情况效率,但转移过程中的所有Seralizations StreamingContext.State
。因此,通过在Base64中进行编码,您将要进行
byte[]
byte[]
将string
转换为ToBase64String
(将尺寸增加 4 / 3 到期编码)SerializationInfo
SerializationInfo
及其重复标记string
string
byte[]
转换回FromBase64String
byte[]
转换回非托管二进制blob。如果您从未编码为字符串并且仅将byte[]
作为对象传递给SerializationInfo
对象,则步骤几乎相同,它只是没有 4 < / sup> / 3 datablob的大小增加,将二进制数据编码为文本。
byte[]
byte[]
传递到SerializationInfo
SerializationInfo
及其重复标记byte[]
byte[]
转换回非托管二进制blob。所以我猜“优化”正在传输,因为byte[]
的好处是不会增加你必须传输给desearizer的数据量。