我们在为特定列序列化之后保存数据,所以在检索数据和反序列化之前如何检查字符串是否可反序列化?
问问题
1720 次
1 回答
4
确保一个字符串表示一个有效的序列化对象几乎与执行反序列化本身一样困难,因为您需要遍历序列化对象图,找出每个序列化字段的开始位置,以及进入该字段的数据是什么。
您可以保存的唯一操作是对象及其依赖项的分配。这些操作当然不是免费的,但它们经过高度优化,因此您的节省不会太大。
您可以采取推测的方法,并假设您的反序列化将成功,而不是在反序列化之前预先验证字符串。您的代码可以直接反序列化您的字符串,并且在大多数情况下它会成功!*为确保您的代码在字符串无效时不会中断,请将反序列化调用包装到 atry/catch
中,并注意反序列化异常。如果你抓住其中任何一个,你就知道这个字符串是无效的;如果您没有捕获反序列化异常,您将知道该字符串是有效的,并且您还可以准备好您的反序列化对象以供使用。
假设 XML 序列化,您的代码可以执行以下操作:
static bool TryDeserialize<T>(string xmlStr, out T obj) {
var ser = new XmlSerializer(typeof(T));
using(var stringReader = new StringReader(xmlStr)) {
using (var xmlReader = new XmlTextReader(stringReader)) {
try {
obj = ser.Deserialize(xmlReader);
} catch {
obj = default(T);
return false;
}
}
}
return true;
}
*如果你的反序列化在绝大多数情况下都失败了,你可能需要重新考虑这个策略。
于 2012-07-10T20:57:35.590 回答