【发布时间】:2013-11-30 08:17:21
【问题描述】:
我有一个引用类型,它在非托管内存中包含原始图像数据。很清楚如何使用SerializationInfo 存储元数据(宽度、高度),但是存储 BLOB 的最佳方式是什么?
我唯一能看到的是使用Convert.ToBase64String,这需要大量的复制。有没有更直接的方法?
【问题讨论】:
标签: .net serializable
我有一个引用类型,它在非托管内存中包含原始图像数据。很清楚如何使用SerializationInfo 存储元数据(宽度、高度),但是存储 BLOB 的最佳方式是什么?
我唯一能看到的是使用Convert.ToBase64String,这需要大量的复制。有没有更直接的方法?
【问题讨论】:
标签: .net serializable
更新:有更好的方法来处理这个问题!
您需要做的是查看传递给GetObjectData 的StreamingContext,StreamingContext.State 属性可以告诉您正在发生什么样的序列化。如果您通过了Clone 或CrossAppDomain 状态,您可能能够重用您对非托管blob 拥有的现有句柄,只需将句柄指针传递给SerializationInfo 对象。
无论您选择什么,您都需要进行大量复制,但Convert.ToBase64String 是不必要的,您只需将您传递给Convert.ToBase64String 的托管byte[] 序列化就可以了。
我不知道byte[] 是否有任何特殊情况的效率,但是在传输过程中所有序列化get turned in to a byte stream。因此,通过在 Base64 中编码,您将要做的事情
byte[]
ToBase64String 将您的byte[] 转换为string(由于编码,大小增加了4/3 倍)李>
SerializationInfo
SerializationInfo
string
FromBase64String 将string 转换回byte[]
byte[] 转换回非托管二进制 blob。如果您从不编码为字符串,而只是将 byte[] 作为对象传递给 SerializationInfo 对象,则步骤几乎相同,只是没有那个 4/ 3 增加数据块的大小以将二进制数据编码为文本。
byte[]
byte[] 传递给SerializationInfo
SerializationInfo
byte[]
byte[] 转换回非托管二进制 blob。所以我猜想“优化”是作为byte[] 传输的,其好处是不会增加您必须传输到去耳化器的数据量。
【讨论】:
byte[] 是为了提高效率而特例,你知道吗,还是将元数据存储在每个单独的元素后面作为单独的项目?有没有其他简单的方法可以在程序运行之间存储一些对象?
BinaryFormmater 可能是“最简单”的解决方案)?
AddValue( 的this overload 的对象可以进行优化.将会发生的事情是它将在传入的对象上调用GetObjectData(),并且嵌套的searlizer会执行它选择做的任何优化(因此由Array的seralizer来确定是否有任何优化)
byte[],然后将您的序列化流传递给XMLSearalizer,它会将byte[] 文件编码为十六进制,这将在大小上比 Base64 编码效率低得多,所以也许 Base64 会更好。