我们在为特定列序列化后保存数据,所以在检索数据时和反序列化之前如何检查字符串是否可反序列化?
答案 0 :(得分:4)
确保字符串表示有效的序列化对象几乎与执行反序列化对象一样困难,因为您需要遍历序列化对象图,找出每个序列化字段的起始位置,以及进入该序列化字段的数据是什么字段。
您可以保存的唯一操作是对象及其依赖项的分配。这些操作当然不是免费的,但它们是高度优化的,因此您的节省不会过于重要。
您可以采用推测方法,而不是在反序列化之前预先验证字符串,并假设您的反序列化将成功。您的代码可以直接跳转到反序列化字符串,并且在大多数情况下它会成功! * 为了确保在字符串无效时您的代码不会中断,请将反序列化调用包装成try/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;
}
<小时/> * 如果您的反序列化在绝大多数情况下都失败了,您可能需要重新考虑这个策略。