XML序列化成功反序列化失败以及xml 十六进制值 0x0E)是无效的字符
出现XML序列化成功,但是反序列化失败问题
可能由于被序列化的对象中包含低序位非打印 ASCII 字符例如字符:
字符在序列化时会把把一个字符串中的 低序位 ASCII 字符 替换成 &#x 编码字符
例如
<?xml version="1.0"?>
<User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserName>好强大</UserName>
</User>
例如就是编码后的 字符
/// 把一个字符串中的 低序位 ASCII 字符 替换成16进制s字符
/// 转换 ASCII 0 - 8 -> � -
/// 转换 ASCII 11 - 12 -> -
/// 转换 ASCII 14 - 31 -> -
/// </summary>
/// <param name="tmp"></param>
/// <returns></returns>
public static string ReplaceLowOrderASCIICharacters(string tmp)
{
StringBuilder info = new StringBuilder();
foreach (char cc in tmp)
{
int ss = (int)cc;
if (((ss >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 32)))
info.AppendFormat("{0:X};", ss);
else info.Append(cc);
}
return info.ToString();
}
如果反序列化时未给这种做特殊处理,反序列化将失败,
处理方式如下:
1.序列化时给此类字符做特殊编码
2.在反序列化时替换掉
如果xml中包含有未编码的低位字符,XmlDocument对象将报错
例如
1.txt文件内容如下
<?xml version="1.0"?>
<User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserName>好强大</UserName>
</User>
好有红色标记的低位特殊字符,所有xml需要将这类字符替换掉
替换掉未编码的低位序列字符,例如替换掉:
public static string Repalce(string str)
{
return System.Text.RegularExpressions.Regex.Replace(str, @"[\x00-\x08]|[\x0B-\x0C]|[\x0E-\x1F]", "");
}
替换后xml正常加载