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

GAN*_*ANI 4 .net c# serialization xml-serialization

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

das*_*ght 6

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

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

您可以采取推测方法,并假设反序列化会成功,而不是在反序列化之前预先验证字符串。您的代码可以直接跳转到反序列化您的字符串,并且在大多数情况下它会成功!*为了确保您的代码在字符串无效时不会中断,请将反序列化调用包装到 中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;
}
Run Code Online (Sandbox Code Playgroud)


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