如何检查字符串是否包含C#中的反序列化数据?

如何检查字符串是否包含C#中的反序列化数据?,c#,.net,serialization,xml-serialization,C#,.net,Serialization,Xml Serialization,我们在序列化特定列后保存数据,因此在检索数据和反序列化之前,如何检查字符串是否可反序列化???确保字符串表示有效的序列化对象几乎与执行反序列化本身一样困难,因为您需要遍历序列化对象图,找出每个序列化字段的起始位置,以及进入该字段的数据是什么 可以保存的唯一操作是对象及其依赖项的分配。这些操作当然不是免费的,但它们经过了高度优化,因此您的节省不会太多 不必在反序列化之前预先验证字符串,您可以采取推测性的方法,并假设反序列化将成功。您的代码可以直接跳转到对字符串进行反序列化,在大多数情况下,它会成功

我们在序列化特定列后保存数据,因此在检索数据和反序列化之前,如何检查字符串是否可反序列化???

确保字符串表示有效的序列化对象几乎与执行反序列化本身一样困难,因为您需要遍历序列化对象图,找出每个序列化字段的起始位置,以及进入该字段的数据是什么

可以保存的唯一操作是对象及其依赖项的分配。这些操作当然不是免费的,但它们经过了高度优化,因此您的节省不会太多

不必在反序列化之前预先验证字符串,您可以采取推测性的方法,并假设反序列化将成功。您的代码可以直接跳转到对字符串进行反序列化,在大多数情况下,它会成功!*为确保字符串无效时代码不会中断,请将反序列化调用包装到
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;
}
static bool TryDeserialize(字符串xmlStr,out T obj){
var ser=新的XmlSerializer(typeof(T));
使用(var stringReader=newstringreader(xmlStr)){
使用(var xmlReader=新的XmlTextReader(stringReader)){
试一试{
obj=序列反序列化(xmlReader);
}抓住{
obj=默认值(T);
返回false;
}
}
}
返回true;
}


*如果反序列化在绝大多数情况下都失败,您可能需要重新考虑此策略。

是否可以尝试反序列化并捕获异常?。是的,我能够捕获异常,因此无法检查字符串是否正确serialized@dasblinkenlight是的,那么做。您的代码应确保特定列只保存与特定类型的序列化数据相对应的值。是的,该列的类型为nvarchar@dasblinkenlight我会考虑一般的答案。